home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr42 / soundss2.zip / USMOD.ASM < prev    next >
Assembly Source File  |  1994-08-24  |  62KB  |  2,878 lines

  1. ;
  2. ;       ╔═════════════════════════════╗
  3. ;       ║                             ║
  4. TITLE   ║ GRAVIS ULTRASOUND MODPLAYER ║
  5. ;       ║                             ║
  6. ;       ╚═════════════════════════════╝
  7. ;
  8. ; THIS MODULE PLAYER WAS CODED IN EARLY 1994
  9. ;
  10. ;                        BY SILVIO TURELLO (FRONTMAN/CREW242)
  11. ;
  12. ; IT IS A COMPLETELY REVISED VERSION OF GUSPLAY 1.5
  13. ;
  14. ;                        BY ROBERT ADOLFSSON (CASCADA)
  15. ;
  16. ; FEATURES: 4/6/8-CHANNEL-MODS (M.K./FLT4/FLT8/OCTA/8CHN/6CHN)
  17. ;
  18. ;           5-FX-CHANNELS, FULL MOD-FX SUPPORT, FULL 8/16-BIT DMA SUPPORT
  19. ;
  20. DOSSEG
  21. .MODEL TINY
  22. STACKLENGTH     = 0100H
  23. ASSUME CS:DGROUP, DS:DGROUP; SS:DGROUP
  24. ;=============================================================================
  25. IRQ1            = 20H
  26. IRQ2        = 21H
  27. IRQ3        =0A0H
  28. IRQ4        =0A1H
  29. TIMER0        = 40H
  30. PIT1        = 43H
  31. UHR_INDEX    = 70H
  32. UHR_PORT    = 71H
  33. UHR_STATA    = 0AH
  34. UHR_STATB    = 0BH
  35. UHR_STATC    = 0CH
  36. ;-----------------------------------------------------------------------------
  37. NumVoices    = 14        ; Number of voices to use
  38. StatusPort    = 6h        ; UltraSound Ports
  39. TimerCtrlPort    = 8h
  40. TimerDataPort    = 9h
  41. DMASetPort    = 0Bh
  42. MidiCtrlPort    = 100h
  43. MidiDataPort    = 101h
  44. ActiveVoicePort    = 102h
  45. CommandPort    = 103h
  46. DataLowPort    = 104h
  47. DataHighPort    = 105h
  48. DRAMIOPort    = 107h
  49.  
  50. WriteVoiceMode    = 00h        ; UltraSound Commands
  51. SetVoiceFreq    = 01h        ; Value=Freq/Divisor
  52. LoopStartLo    = 02h
  53. LoopStartHi    = 03h
  54. SampleEndLo    = 04h
  55. SampleEndHi    = 05h
  56. VolRampRate    = 06h
  57. VolRampStart    = 07h
  58. VolRampEnd    = 08h
  59. SetVolume    = 09h
  60. SampleStartLo    = 0Ah
  61. SampleStartHi    = 0Bh
  62. VoiceBalance    = 0Ch
  63. VolumeCtrl    = 0Dh
  64. VoicesActive    = 0Eh
  65. DMACtrl        = 41h
  66. DMAAddr        = 42h
  67. DRAMAddrLo    = 43h
  68. DRAMAddrHi    = 44h
  69. Initialize    = 4Ch
  70. ReadVolume    = 89h
  71. VoicePosLo    = 8Ah
  72. VoicePosHi    = 8Bh
  73. ReadVolCtrl    = 8Dh
  74.  
  75. Voices14    = 4300        ; Divisors
  76. Voices15    = 4000
  77. Voices16    = 3700
  78. Voices17    = 3500
  79. Voices18    = 3300
  80. Voices19    = 3100
  81. Voices20    = 3030
  82. Voices21    = 2800
  83. Voices22    = 2700
  84. Voices23    = 2600
  85. Voices24    = 2500
  86. Voices25    = 2400
  87. Voices26    = 2300
  88. Voices27    = 2200
  89. Voices28    = 2100
  90. Voices29    = 2000
  91. Voices30    = 2000
  92. Voices31    = 1900
  93. Voices32    = 1800
  94. ;-----------------------------------------------------------------------------
  95. CHAN_SIZE    = 52
  96. CHAN_INFO STRUC
  97. SAMP_OFF    DD 0
  98. FREQ_VAL     DW 0
  99. VOL         DW 0
  100. OLD_VOL        DW 0
  101. FINE         DW 0
  102. REPEAT         DW 0
  103. REPLEN         DW 0
  104. LEN         DW 0
  105. AMIGA         DW 0
  106. EFFECT         DW 0
  107. VIBRATO_POINT     DW 0
  108. OLD_VIBRATO     DW 0
  109. PORT_TO        DW 0
  110. OLD_PORT_TO     DW 0
  111. EFFECT_TIME    DW 0
  112. CURR_SAMP    DW 0
  113. OLD_SAMP    DW 0
  114. ARP         DW 0,0,0
  115. ARP_COUNTER     DW 0
  116. INST_SET    DB 0
  117. BALANCE        DB 0
  118. LOOP_ONOFF    DW 0
  119. OFFSET_ADD    DW 0
  120. TRACK_OFF    DW 0
  121. CHAN_INFO ENDS
  122. ;=============================================================================
  123.  
  124. .DATA
  125. ;=============================================================================
  126. PROG_START_SEG  DW 0
  127. PROG_END_SEG    DW 0
  128. GDDLENGTH    DD 0
  129. GDDREST        DW 0
  130. GDDHANDLE    DW 0
  131. ;GDDMIN        DW -1
  132. ;GDDNEW        DW 0
  133. ;GDDPOSL    DW 0
  134. ;GDDPOSH    DW 0
  135. GDDSEG        DW 0
  136. BUFSEG        DW 0
  137. GDDZEIG        DB 0
  138. SAM_CH        DB 8
  139. MOD_STAT    DB 0
  140. US_MODUS    DB 0
  141. SYSTEM        DB 0
  142. IRQCOUNT    DB 56
  143. COMP_SPEED2     DW 0106H
  144. COMP_SPEED3     DW 4006H
  145. COMP_SPEED4     DW 0
  146. COMP_SPEED5     DW 1165
  147. HOLD70  LABEL   DWORD
  148.         DW OFFSET CONTROL_CHANNELS, 0
  149. PAN_REGS    DB 3,12,12,3,3,12,12,3,3,12,5,10,7,8
  150. ;-----------------------------------------------------------------------------
  151. ERROR1_TEXT    DB "MOD ERROR",13,10,"$"
  152. ERROR2_TEXT    DB "FX ERROR",13,10,"$"
  153. OUT_TEXT    DB "+/- VOLUME",13,10
  154.         DB "1   PLAY SAMPLE",13,10
  155.         DB "9   INIT REPEAT",13,10
  156.         DB "0   MUSIC MODE",13,10,"$"
  157. SAMPLE_NAME    DB "SAMPLE1.SAM",0
  158. CONFIG_NAME     DB "SS.CFG",0
  159. VOL_NAME    DB "FM.VOL",0
  160. CFG_TEXT2       DB "DEFAULT MUSIC MODE = ",0
  161. CFG_TEXT3       DB "SOUNDCARD BASE PORT = ",0
  162. CFG_TEXT5       DB "SOUNDCARD DMA NUMBER = ",0
  163. CFG_TEXT7       DB "SYSTEM COMPATIBILITY = ",0
  164. DMA_ADR        DB 0,2,4,6,0C0H,0C4H,0C8H,0CCH
  165. DMA_CNT        DB 1,3,5,7,0C2H,0C6H,0CAH,0CEH
  166. DMA_PAGE    DB 87H,83H,81H,82H,8FH,8BH,89H,8AH
  167. DMA_STAT    DB 08H,08H,08H,08H,0D0H,0D0H,0D0H,0D0H
  168. DMA_BITS    DB 1,2,4,8,1,2,4,8
  169. DMA_MASK    DB 0AH,0AH,0AH,0AH,0D4H,0D4H,0D4H,0D4H
  170. DMA_MOD        DB 0BH,0BH,0BH,0BH,0D6H,0D6H,0D6H,0D6H
  171. DMA_FLIP    DB 0CH,0CH,0CH,0CH,0D8H,0D8H,0D8H,0D8H
  172. DMA_RESET    DB 0DH,0DH,0DH,0DH,0DAH,0DAH,0DAH,0DAH
  173. DMA_SET_DATA    DB 0,1,0,2,0,3,4,5
  174. ;-----------------------------------------------------------------------------
  175. ; PROTRACKER VARIABLEN
  176. ;-----------------------------------------------------------------------------
  177. ALIGN 2
  178. BASE_PORT    DW 220H
  179. DMA_CHANNEL    DW 1            ;DMA 0 IS NO DMA (BYTE-PUSHING)
  180. MASTER_VOLUME    DW 255
  181. MUSIC_VOLUME    DW 255
  182. FX_VOLUME    DW 255
  183. MUSIC_VOL    DW 255
  184. FX_VOL        DW 255
  185. BPM_COUNT    DD 0
  186. BPM_SPEED    DD 0
  187. COUNTER        DW 0
  188. CH_NUMB        DW 4
  189. PATT_SPEED    DW 0
  190. PATT_COUNT    DW 0
  191. PATT_ROW    DW 0
  192. PATT_CURRENT    DW 0
  193. PATT_BREAK    DW 0
  194. ;-----------------------------------------------------------------------------
  195. ; MTM - TRACKSTRUKTUR
  196. ;-----------------------------------------------------------------------------
  197. ALIGN 2
  198. TRACK_NUMBER    DW 0
  199. TRACK_INFO    DB 8 DUP(0)
  200. TRACK_SEG    DW 0
  201. TRACKS_OFFSET    DW OFFSET TRACK1_DATA, OFFSET TRACK2_DATA, OFFSET TRACK3_DATA
  202.         DW OFFSET TRACK4_DATA, OFFSET TRACK5_DATA, OFFSET TRACK6_DATA
  203.         DW OFFSET TRACK7_DATA, OFFSET TRACK8_DATA
  204. TRACK1_DATA    DB 128 DUP(0)
  205. TRACK2_DATA    DB 128 DUP(0)
  206. TRACK3_DATA    DB 128 DUP(0)
  207. TRACK4_DATA    DB 128 DUP(0)
  208. TRACK5_DATA    DB 128 DUP(0)
  209. TRACK6_DATA    DB 128 DUP(0)
  210. TRACK7_DATA    DB 128 DUP(0)
  211. TRACK8_DATA    DB 128 DUP(0)
  212. ;-----------------------------------------------------------------------------
  213. ; MOD - DATEISTRUKTUR
  214. ;-----------------------------------------------------------------------------
  215. ALIGN 2
  216. PATTERN_SIZE    DW 0
  217. PATTERN_SEG    DW 0
  218. PATTERN_NUMBER    DW 0
  219. IOFFSET        DD 31 DUP(0)
  220. ISIZE        DW 31 DUP(0)
  221. IVOLUME        DW 31 DUP(0)
  222. IFINETUNE    DW 31 DUP(0)
  223. ILOOP_START    DW 31 DUP(0)
  224. ILOOP_SIZE    DW 31 DUP(0)
  225. SONG_SIZE    DB 0
  226. SONG_LOOP    DB 0
  227. ;-----------------------------------------------------------------------------
  228. ; PLAYER - KONTROLLSTRUKTUREN
  229. ;-----------------------------------------------------------------------------
  230. ALIGN 2
  231. SONG_DATA    LABEL    BYTE
  232. FREQ_TABLE    DW 716 DUP(0)    ;908
  233. QUEUE_BUFFER    DW 128 DUP(0)
  234. MOD_NAME    DB 128 DUP(0)
  235. SAMP_CHANS    CHAN_INFO 8 DUP(<>)
  236. SAMPLE_CHAN    CHAN_INFO <>
  237. ;-----------------------------------------------------------------------------
  238. ; SINGLE SAMPLE VARIABLES
  239. ;-----------------------------------------------------------------------------
  240. GUS_MEM        DD 0
  241. SAMPLE_ZEIG    DW 0
  242. SAMPLE_MEM    DD 48 DUP(0)
  243. SAMPLE_BIG    DW 48 DUP(0)
  244. SAM_COUNT    DW 5 DUP(0)
  245. ;-----------------------------------------------------------------------------
  246. ALIGN 2
  247. PattJumps    DW OFFSET ARPeggioFix    ; 0
  248.         DW OFFSET NoPattEFFECT    ; 1
  249.         DW OFFSET NoPattEFFECT    ; 2
  250.         DW OFFSET PORT_TOFix    ; 3
  251.         DW OFFSET VibratoFix    ; 4
  252.         DW OFFSET NoPattEFFECT    ; 5
  253.         DW OFFSET NoPattEFFECT    ; 6
  254.         DW OFFSET NoPattEFFECT    ; 7
  255.         DW OFFSET NoPattEFFECT    ; 8
  256.         DW OFFSET SampleOff    ; 9
  257.         DW OFFSET NoPattEFFECT    ; A
  258.         DW OFFSET PosJump    ; B
  259.         DW OFFSET VOLume    ; C
  260.         DW OFFSET BreakPatt    ; D
  261.         DW OFFSET NoPattEFFECT    ; E
  262.         DW OFFSET SpeedSet    ; F
  263.  
  264. EPattJumps    DW OFFSET NoPattEFFECT    ; 0
  265.         DW OFFSET FINEPortUp    ; 1
  266.         DW OFFSET FINEPortDown    ; 2
  267.         DW OFFSET NoPattEFFECT    ; 3
  268.         DW OFFSET NoPattEFFECT    ; 4
  269.         DW OFFSET NoPattEFFECT    ; 5
  270.         DW OFFSET NoPattEFFECT    ; 6
  271.         DW OFFSET NoPattEFFECT    ; 7
  272.         DW OFFSET PANNING    ; 8
  273.         DW OFFSET NoPattEFFECT    ; 9
  274.         DW OFFSET FINEVOLUP    ; A
  275.         DW OFFSET FINEVOLDown    ; B
  276.         DW OFFSET NoPattEFFECT    ; C
  277.         DW OFFSET NoPattEFFECT    ; D
  278.         DW OFFSET NoPattEFFECT    ; E
  279.         DW OFFSET NoPattEFFECT    ; F
  280.  
  281. EFFECTJumps    DW OFFSET ARPeggio    ; 0
  282.         DW OFFSET PortUp    ; 1
  283.         DW OFFSET PortDown    ; 2
  284.         DW OFFSET PORT_TOTone    ; 3
  285.         DW OFFSET Vibrato    ; 4
  286.         DW OFFSET PORT_TOVSlide    ; 5
  287.         DW OFFSET VibratoVSlide    ; 6
  288.         DW OFFSET NoEFFECT    ; 7
  289.         DW OFFSET NoEFFECT    ; 8
  290.         DW OFFSET NoEFFECT    ; 9
  291.         DW OFFSET VOLSlide    ; A
  292.         DW OFFSET NoEFFECT    ; B
  293.         DW OFFSET NoEFFECT    ; C
  294.         DW OFFSET NoEFFECT    ; D
  295.         DW OFFSET NoEFFECT    ; E
  296.         DW OFFSET NoEFFECT    ; F
  297.  
  298. EEFFECTJumps    DW OFFSET NoEFFECT    ; 0
  299.         DW OFFSET NoEFFECT    ; 1
  300.         DW OFFSET NoEFFECT    ; 2
  301.         DW OFFSET NoEFFECT    ; 3
  302.         DW OFFSET NoEFFECT    ; 4
  303.         DW OFFSET NoEFFECT    ; 5
  304.         DW OFFSET NoEFFECT    ; 6
  305.         DW OFFSET NoEFFECT    ; 7
  306.         DW OFFSET NoEFFECT    ; 8
  307.         DW OFFSET RetrigNote    ; 9
  308.         DW OFFSET NoEFFECT    ; A
  309.         DW OFFSET NoEFFECT    ; B
  310.         DW OFFSET CutNote    ; C
  311.         DW OFFSET DelayNote    ; D
  312.         DW OFFSET NoEFFECT    ; E
  313.         DW OFFSET NoEFFECT    ; F
  314.  
  315. SIN_TAB        DB 0,25,50,74,98,120,142,162,180,197,212,225,236
  316.         DB 244,250,254,255,254,250,244,236,225,212,197,180
  317.         DB 162,142,120,98,74,50,25
  318.  
  319. PERIOD_TABLE    LABEL    WORD
  320. DW 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to H-1 Finetune +0.
  321. DW 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to H-2 Finetune +0.
  322. DW 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to H-3 Finetune +0.
  323. DW 107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56 ;C-4 to H-4 Finetune +0.
  324.  
  325. DW 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to H-1 Finetune +1.
  326. DW 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to H-2 Finetune +1.
  327. DW 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to H-3 Finetune +1.
  328. DW 106,100, 94, 89, 84, 79, 75, 71, 67, 83, 59, 56 ;C-4 to H-4 Finetune +1.
  329.  
  330. DW 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to H-1 Finetune +2.
  331. DW 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to H-2 Finetune +2.
  332. DW 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to H-3 Finetune +2.
  333. DW 105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59, 56 ;C-4 to H-4 Finetune +2.
  334.  
  335. DW 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to H-1 Finetune +3.
  336. DW 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to H-2 Finetune +3.
  337. DW 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to H-3 Finetune +3.
  338. DW 104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59, 55 ;C-4 to H-4 Finetune +3.
  339.  
  340. DW 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to H-1 Finetune +4.
  341. DW 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to H-2 Finetune +4.
  342. DW 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to H-3 Finetune +4.
  343. DW 104, 98, 92, 87, 82, 78, 73, 69, 65, 62, 58, 55 ;C-4 to H-4 Finetune +4.
  344.  
  345. DW 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to H-1 Finetune +5.
  346. DW 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to H-2 Finetune +5.
  347. DW 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to H-3 Finetune +5.
  348. DW 103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58, 54 ;C-4 to H-4 Finetune +5.
  349.  
  350. DW 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to H-1 Finetune +6.
  351. DW 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to H-2 Finetune +6.
  352. DW 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to H-3 Finetune +6.
  353. DW 102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57, 54 ;C-4 to H-4 Finetune +6.
  354.  
  355. DW 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to H-1 Finetune +7.
  356. DW 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to H-2 Finetune +7.
  357. DW 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to H-3 Finetune +7.
  358. DW 102, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57, 54 ;C-4 to H-4 Finetune +7.
  359.  
  360. DW 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to H-1 Finetune -8.
  361. DW 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to H-2 Finetune -8.
  362. DW 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to H-3 Finetune -8.
  363. DW 113,107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60 ;C-4 to H-4 Finetune -8.
  364.  
  365. DW 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to H-1 Finetune -7.
  366. DW 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to H-2 Finetune -7.
  367. DW 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to H-3 Finetune -7.
  368. DW 112,106,100, 94, 89, 84, 79, 75, 71, 67, 63, 59 ;C-4 to H-4 Finetune -7.
  369.  
  370. DW 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to H-1 Finetune -6.
  371. DW 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to H-2 Finetune -6.
  372. DW 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to H-3 Finetune -6.
  373. DW 111,105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -6.
  374.  
  375. DW 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to H-1 Finetune -5.
  376. DW 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to H-2 Finetune -5.
  377. DW 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to H-3 Finetune -5.
  378. DW 111,104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -5.
  379.  
  380. DW 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to H-1 Finetune -4.
  381. DW 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to H-2 Finetune -4.
  382. DW 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to H-3 Finetune -4.
  383. DW 110,104, 98, 92, 87, 82, 78, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -4.
  384.  
  385. DW 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to H-1 Finetune -3.
  386. DW 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to H-2 Finetune -3.
  387. DW 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to H-3 Finetune -3.
  388. DW 109,103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -3.
  389.  
  390. DW 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to H-1 Finetune -2.
  391. DW 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to H-2 Finetune -2.
  392. DW 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to H-3 Finetune -2.
  393. DW 108,102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57 ;C-4 to H-4 Finetune -2.
  394.  
  395. DW 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to H-1 Finetune -1.
  396. DW 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to H-2 Finetune -1.
  397. DW 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to H-3 Finetune -1.
  398. DW 108,101, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57 ;C-4 to H-4 Finetune -1.
  399.  
  400. GUS_VOL        DW 05000H,08FF0H,09FF0H,0A800H,0AFF0H,0B400H,0B800H,0BC00H
  401.         DW 0BFF0H,0C200H,0C400H,0C600H,0C800H,0CA00H,0CC00H,0CE00H
  402.         DW 0CFF0H,0D100H,0D200H,0D300H,0D400H,0D500H,0D600H,0D700H
  403.         DW 0D800H,0D900H,0DA00H,0DB00H,0DC00H,0DD00H,0DE00H,0DF00H
  404.         DW 0DFF0H,0E080H,0E100H,0E180H,0E200H,0E280H,0E300H,0E380H
  405.         DW 0E400H,0E480H,0E500H,0E580H,0E600H,0E680H,0E700H,0E780H
  406.         DW 0E800H,0E880H,0E900H,0E980H,0EA00H,0EA80H,0EB00H,0EB80H
  407.         DW 0EC00H,0EC80H,0ED00H,0ED80H,0EE00H,0EE80H,0EF00H,0EF80H
  408.         DW 0F800H    ;SINGLE SAMPLE MAX VOL > SONG MAX VOL
  409. ;-----------------------------------------------------------------------------
  410. PROG_END        LABEL   BYTE    ;MUST BE LAST ROW IN DATA SEGMENT!
  411. ;-----------------------------------------------------------------------------
  412.  
  413. .386
  414. .CODE 
  415. ORG 100H
  416. ;=============================================================================
  417. MAIN PROC NEAR
  418.     JMP    MAIN_CONT        ;0100
  419.     RETF
  420.     CALL    CONFIG_INIT        ;0104
  421.     RETF
  422.     CALL    LOAD_MOD        ;0108
  423.     RETF
  424.     CALL    PLAY_MUSIC        ;010C
  425.     RETF
  426.     CALL    STOP_MUSIC        ;0110
  427.     RETF
  428.     CALL    END_MUSIC        ;0114
  429.     RETF
  430.     CALL    LOAD_SAMPLE        ;0118
  431.     RETF
  432.     CALL    PLAY_SAMPLE        ;011C
  433.     RETF
  434.     CALL    END_SAMPLE        ;0120
  435.     RETF
  436.     JMP    NOFUNC            ;0124
  437. NOFUNC:    RETF
  438.     CALL    GET_VOLUME        ;0128
  439.     RETF
  440.     CALL    SET_VOLUME        ;012C
  441.     RETF
  442.     CALL    SET_SONGLOOP        ;0130
  443.     RETF
  444.     CALL    GET_SONGPOSITION    ;0134
  445.     RETF
  446.     CALL    SET_SONGPOSITION    ;0138
  447.     RETF
  448.     CALL    GET_SONGMOD        ;013C
  449.     RETF
  450.     CALL    SET_SONGMOD        ;0140
  451.     RETF
  452.     CALL    US_OFF            ;0144
  453.     RETF
  454.     CALL    INIT_DEVICE        ;0148
  455.     RETF
  456.     CALL    INIT_DEVICE        ;014C/FREE
  457.     RETF
  458.     CALL    INIT_DEVICE        ;0150/FREE
  459.     RETF
  460. MAIN ENDP
  461. ;=============================================================================
  462. MAIN_CONT:
  463.     MOV    AX,CS            ;DS SET
  464.     MOV    DS,AX
  465.     MOV     PROG_START_SEG,ES       ;PROGRAMM START
  466.     MOV     AX,SS                   ;AND -END SET
  467.     MOV     BX,OFFSET PROG_END
  468.     ADD     BX,STACKLENGTH
  469.     MOV     SP,BX
  470.     SHR     BX,4
  471.     INC     BX
  472.     ADD     AX,BX
  473.     MOV     PROG_END_SEG,AX
  474.     XOR    BX,BX
  475. GL1:    MOV    AL,ES:[82H+BX]
  476.     OR    AL,AL
  477.     JZ    SHORT GL2
  478.     CMP    AL,20H
  479.     JE    SHORT GL2
  480.     CMP    AL,0DH
  481.     JE    SHORT GL2
  482.     MOV    [MOD_NAME+BX],AL
  483.     INC    BX
  484.     CMP    BX,40H
  485.     JB    GL1
  486. GL2:    OR    BX,BX
  487.     JZ    GMEND
  488.     XOR    AL,AL
  489.     MOV    [MOD_NAME+BX],0
  490.     MOV     BX,PROG_END_SEG         ;RESIZE OWN ALLOCATION
  491.     SUB     BX,PROG_START_SEG
  492.     MOV     ES,PROG_START_SEG
  493.     MOV     AH,4AH
  494.     INT     21H
  495. ;-----------------------------------------------------------------------------
  496. ; INITIALIZING & STARTING
  497. ;    MOV    AL,255            ;SET MAXIMUM VOLUME
  498. ;    MOV    BL,AL
  499. ;    MOV    BH,AL
  500. ;    CALL    SET_VOLUME
  501.     CALL    CONFIG_INIT        ;GET CONFIG
  502.     MOV    DX,OFFSET MOD_NAME    ;FIRST, TRY LOADING
  503.     CALL    LOAD_MOD
  504.     JNC    SHORT GM1
  505.     MOV    AH,9
  506.     MOV    DX,OFFSET ERROR1_TEXT
  507.     INT    21H
  508.     JMP    SHORT GM4
  509. GM1:    MOV    DX,OFFSET SAMPLE_NAME    ;GET SAMPLE
  510.     MOV    CL,80H            ;PC-SAMPLE
  511.     CALL    LOAD_SAMPLE
  512.     JNC    SHORT GM2
  513.     MOV    AH,9
  514.     MOV    DX,OFFSET ERROR2_TEXT
  515.     INT    21H
  516. GM2:    CALL    PLAY_MUSIC        ;TRY STARTING
  517. ;-----------------------------------------------------------------------------
  518. ; THIS COULD BE THE MAIN ROUTINE
  519.     MOV    AH,9
  520.     MOV    DX,OFFSET OUT_TEXT
  521.     INT    21H
  522. LM1:    XOR    AH,AH
  523.     INT    16H
  524.     CMP    AL,27
  525.     JE    SHORT GM5
  526.     CMP    AL,"+"
  527.     JNE    SHORT G1
  528.     CALL    GET_VOLUME
  529.     INC    AL
  530.     CALL    SET_VOLUME
  531.     JMP    LM1
  532. G1:    CMP    AL,"-"
  533.     JNE    SHORT G2
  534.     CALL    GET_VOLUME
  535.     DEC    AL
  536.     CALL    SET_VOLUME
  537.     JMP    LM1
  538. G2:    CMP    AL,"9"
  539.     JNE    SHORT G3
  540.     MOV    AL,0
  541.     CALL    SET_SONGLOOP
  542.     JMP    LM1
  543. G3:    CMP    AL,"0"
  544.     JNE    SHORT G4
  545.     INC    US_MODUS
  546.     AND    US_MODUS,3
  547.     JMP    LM1
  548. G4:    CMP    AL,"1"
  549.     JNE    LM1
  550.     XOR    BX,BX            ;HANDLE
  551.     MOV    CX,22222        ;FREQUENCE
  552.     CALL    PLAY_SAMPLE
  553.     JMP    LM1
  554. ;-----------------------------------------------------------------------------
  555. ; CUTTING OFF
  556. GM5:    CALL    STOP_MUSIC        ;STOP MUSIC
  557.     CALL    END_SAMPLE        ;UNLOAD SAMPLES
  558. GM4:    CALL    END_MUSIC        ;UNLOAD MUSIC
  559. GMEND:    MOV     AX,4C00H                ;DOS
  560.     INT     21H
  561. ;=============================================================================
  562.  
  563.  
  564. ;=============================================================================
  565. ALIGN 2
  566. CONTROL_CHANNELS PROC NEAR
  567.     PUSH    EAX EBX ECX EDX ESI EDI EBP
  568.     PUSH    DS ES CS
  569.     POP    DS
  570.     CMP    SYSTEM,0
  571.     JNE    SHORT WT6
  572.     MOV    AL,UHR_STATC
  573.     OUT    UHR_INDEX,AL
  574.     JMP    SHORT WT1
  575. WT1:    JMP    SHORT WT2
  576. WT2:    IN    AL,UHR_PORT
  577. WT6:    MOV     AL,20H
  578.     OUT     IRQ3,AL
  579.     OUT    IRQ1,AL
  580.     STI
  581.     INC    COUNTER
  582.     MOV    AX,WORD PTR [BPM_SPEED+2]
  583.     ADD    WORD PTR [BPM_COUNT+2],AX
  584.     MOV    AX,WORD PTR [BPM_SPEED]
  585.     ADC    WORD PTR [BPM_COUNT],AX
  586.     JC    JumpPattern
  587.     CMP    COUNTER,4
  588.     JE    SHORT ClearNotes
  589.     CMP    COUNTER,5
  590.     JE    SetNotes
  591.     JMP    EndPattern
  592. ;-----------------------------------------------------------------------------
  593. ClearNotes:
  594.     CMP    MOD_STAT,0
  595.     JE    SHORT NOT_FINISHED
  596.     MOV    PATT_CURRENT,0
  597.     MOV    DI,OFFSET SAMP_CHANS
  598.     MOV    CX,CH_NUMB
  599. FINISH:    MOV    [DI.OLD_VOL],0
  600.     MOV    [DI.VOL],0
  601.     MOV    [DI.AMIGA],0
  602.     MOV    [DI.FREQ_VAL],0
  603.     ADD    DI,CHAN_SIZE
  604.     LOOP    FINISH
  605. NOT_FINISHED:
  606.     MOV    DI,OFFSET SAMP_CHANS
  607.     MOV    CX,CH_NUMB
  608.     MOV    DX,BASE_PORT
  609.     ADD    DX,CommandPort
  610. StopVoices:
  611.     DEC    DX
  612.     MOV    AL,BYTE PTR CH_NUMB
  613.     SUB    AL,CL
  614.     OUT    DX,AL
  615.     INC    DX
  616.     CMP    [DI.INST_SET],2
  617.     JE    SHORT VoiceOff1
  618.     CMP    [DI.INST_SET],1
  619.     JE    SHORT VoiceOff2
  620.     CMP    [DI.OFFSET_ADD],0
  621.     JNE    SHORT VoiceOff1
  622.     JMP    SHORT NoVoiceOff
  623. VoiceOff2:
  624.     MOV    AX,[DI.CURR_SAMP]
  625.     CMP    AX,[DI.OLD_SAMP]
  626.     JNE    SHORT VoiceOff1
  627.     JMP    SHORT NoVoiceOff
  628. VoiceOff1:
  629.     MOV    AX,[DI.OLD_VOL]
  630.     MOV    [DI.OLD_VOL],0
  631.     MOV    BP,GUS_VOL
  632.     MOV    BX,MUSIC_VOL
  633.     MUL    BL
  634.     MOVZX    BX,AH
  635.     SHL    BX,1
  636.     MOV    BX,[GUS_VOL+BX]
  637.     TEST    US_MODUS,2
  638.     JZ    SHORT WITH_SOUND1
  639.     MOV    BX,10000
  640.     MOV    BP,BX
  641. WITH_SOUND1:
  642.     CALL    SEND_RAMP
  643. NoVoiceOff:
  644.     ADD    DI,CHAN_SIZE
  645.     LOOP    StopVoices
  646.     JMP    EndPattern
  647. ;-----------------------------------------------------------------------------
  648. SetNotes:
  649.     MOV    COUNTER,1
  650.     MOV    DI,OFFSET SAMP_CHANS
  651.     MOV    CX,CH_NUMB
  652.     MOV    DX,BASE_PORT
  653.     ADD    DX,CommandPort
  654. ChangeSamps:
  655.     DEC    DX
  656.     MOV    AL,BYTE PTR CH_NUMB
  657.     SUB    AL,CL
  658.     OUT    DX,AL
  659.     INC    DX
  660.     MOV    AL,[DI.BALANCE]        ;PANNING
  661.     MOV    AH,AL
  662.     SHR    AL,4
  663.     AND    AH,0FH
  664.     CMP    AL,AH
  665.     JE    SHORT NO_PANNING
  666.     MOV    AL,AH
  667.     SHL    AL,4
  668.     OR    AL,AH
  669.     MOV    [DI.BALANCE],AL
  670.     MOV    AL,VoiceBalance
  671.     OUT    DX,AL
  672.     ADD    DX,2
  673.     MOV    AL,AH
  674.     OUT    DX,AL
  675.     SUB    DX,2
  676. NO_PANNING:
  677.     CMP    [DI.INST_SET],2
  678.     JE    SHORT SampChange1
  679.     CMP    [DI.INST_SET],1
  680.     JE    SHORT SampChange2
  681.     CMP    [DI.OFFSET_ADD],0
  682.     JNE    SHORT ChangeOffset
  683.     JMP    SHORT NoChangeSamp
  684. ChangeOffset:
  685.     CALL    SEND_SAMPLE_START
  686.     JMP    SHORT NoChangeSamp
  687. SampChange1:
  688.     MOV    AH,3
  689.     CALL    SEND_WRITE_VOICE
  690.     CALL    WAIT_PORT
  691.     CALL    SEND_SAMPLE_START
  692.     MOV    AX,[DI.OLD_SAMP]
  693.     CMP    AX,[DI.CURR_SAMP]
  694.     JE    SHORT NoChangeSamp
  695.     CALL    SEND_SAMPLE_END
  696.     CALL    SEND_SAMPLE_LOOP
  697.     MOV    AH,3
  698.     CALL    SEND_WRITE_VOICE
  699.     JMP    SHORT NoChangeSamp
  700. SampChange2:
  701.     MOV    AX,[DI.OLD_SAMP]
  702.     CMP    AX,[DI.CURR_SAMP]
  703.     JE    SHORT NoChangeSamp
  704.     MOV    AL,VoicePosLo
  705.     OUT    DX,AL
  706.     INC    DX
  707.     IN    AX,DX
  708.     MOV    BX,AX
  709.     DEC    DX
  710.     MOV    AL,VoicePosHi
  711.     OUT    DX,AL
  712.     INC    DX
  713.     IN    AX,DX
  714.     DEC    DX
  715.     XCHG    AX,BX
  716.     SHL    AX,7
  717.     SHR    BX,9
  718.     AND    BX,7FH
  719.     OR    AX,BX
  720.     MOV    BX,[DI.OLD_SAMP]
  721.     DEC    BX
  722.     SHL    BX,2
  723.     SUB    AX,WORD PTR [IOFFSET+BX]
  724.     MOV    BX,AX
  725.     CMP    BX,[DI.LEN]
  726.     JB    SHORT NoFixStart
  727.     MOV    BX,[DI.LEN]
  728.     DEC    BX
  729. NoFixStart:
  730.     CMP    [DI.OFFSET_ADD],0
  731.     JNE    SHORT NoOffsetEff
  732.     MOV    [DI.OFFSET_ADD],BX
  733. NoOffsetEff:
  734.     CALL    SEND_SAMPLE_START
  735.     CALL    SEND_SAMPLE_END
  736.     CALL    SEND_SAMPLE_LOOP
  737.     MOV    AH,BYTE PTR [DI.LOOP_ONOFF]
  738.     CALL    SEND_WRITE_VOICE
  739.     CALL    WAIT_PORT
  740. NoChangeSamp:
  741.     MOV    AX,[DI.OLD_VOL]
  742.     MOV    BX,MUSIC_VOL
  743.     MUL    BL
  744.     MOVZX    BX,AH
  745.     SHL    BX,1
  746.     MOV    BX,[GUS_VOL+BX]
  747.     MOV    AX,[DI.VOL]
  748.     MOV    BP,MUSIC_VOL
  749.     MUL    BP
  750.     MOVZX    BP,AH
  751.     SHL    BP,1
  752.     MOV    BP,CS:[GUS_VOL+BP]
  753.     TEST    US_MODUS,2
  754.     JZ    SHORT WITH_SOUND2
  755.     MOV    BX,10000
  756.     MOV    BP,BX
  757. WITH_SOUND2:
  758.     MOV    DX,BP
  759.     MOV    DL,BH
  760.     CMP    DL,DH
  761.     JNE    SHORT SetVOL
  762.     MOV    DX,BASE_PORT
  763.     ADD    DX,CommandPort
  764.     MOV    AL,VOLumeCtrl
  765.     OUT    DX,AL
  766.     ADD    DX,2
  767.     MOV    AL,3
  768.     OUT    DX,AL
  769.     SUB    DX,2
  770.     MOV    AL,SetVOLume
  771.     OUT    DX,AL
  772.     MOV    AX,BP
  773.     INC    DX
  774.     OUT    DX,AX
  775.     DEC    DX
  776.     JMP    SHORT NoSetVOL
  777. SetVOL:    CALL    SEND_RAMP
  778. NoSetVOL:
  779.     MOV    AL,SetVoiceFreq
  780.     OUT    DX,AL
  781.     INC    DX
  782.     MOV    AX,[DI.FREQ_VAL]
  783.     OUT    DX,AX
  784.     DEC    DX
  785.     SHL    COUNTER,1
  786.     ADD    DI,CHAN_SIZE
  787.     DEC    CX
  788.     JNZ    ChangeSamps
  789.     MOV    DI,OFFSET SAMP_CHANS
  790.     MOV    CX,CH_NUMB
  791. StartVoices:
  792.     DEC    DX
  793.     MOV    AL,BYTE PTR CH_NUMB
  794.     SUB    AL,CL
  795.     OUT    DX,AL
  796.     INC    DX
  797.     CMP    [DI.INST_SET],2
  798.     JNE    SHORT NoVoiceStart
  799.     MOV    AH,BYTE PTR [DI.LOOP_ONOFF]
  800.     CALL    SEND_WRITE_VOICE
  801.     CALL    WAIT_PORT
  802. NoVoiceStart:
  803.     MOV    [DI.INST_SET],0
  804.     MOV    [DI.OFFSET_ADD],0
  805.     ADD    DI,CHAN_SIZE
  806.     LOOP    StartVoices
  807.     JMP    EndPattern
  808. ;-----------------------------------------------------------------------------
  809. JumpPattern:
  810.     MOV    COUNTER,0
  811.     DEC    PATT_COUNT
  812.     JZ    DoPattern
  813.     MOV    DI,OFFSET SAMP_CHANS
  814.     MOV    CX,CH_NUMB
  815. EFFECTLoop:
  816.     MOV    AX,[DI.VOL]
  817.     MOV    [DI.OLD_VOL],AX
  818.     INC    [DI.EFFECT_TIME]
  819.     ADD    [DI.ARP_COUNTER],2
  820.     CMP    [DI.ARP_COUNTER],6
  821.     JB    SHORT NoWrapARP
  822.     MOV    [DI.ARP_COUNTER],0
  823. NoWrapARP:
  824.     MOV    AX,[DI.EFFECT]
  825.     OR    AX,AX
  826.     JZ    NoEFFECT
  827.     MOVZX    BX,AL
  828.     CMP    BL,0EH
  829.     JE    SHORT DoEEFFECTs
  830.     SHL    BX,1
  831.     JMP    [EFFECTJumps+BX]
  832. DoEEFFECTs:
  833.     MOV    BL,AH
  834.     AND    AH,0FH
  835.     SHR    BL,4
  836.     SHL    BX,1
  837.     JMP    [EEFFECTJumps+BX]
  838. ARPeggio:
  839.     MOV    BX,[DI.ARP_COUNTER]
  840.     MOV    BX,[DI.ARP+BX]
  841.     SHL    BX,1
  842.     MOV    AX,[FREQ_TABLE+BX]
  843.     MOV    [DI.FREQ_VAL],AX
  844.     JMP    NoEFFECT
  845. PortUp:    XCHG    AL,AH
  846.     XOR    AH,AH
  847.     MOV    SI,[DI.FINE]
  848.     MOV    BP,[PERIOD_TABLE+47*2+SI]    ;35
  849.     MOV    BX,[DI.AMIGA]
  850.     SUB    BX,AX
  851.     JNC    SHORT NoFix1
  852.     MOV    BX,BP
  853. NoFix1:    CMP    BX,BP
  854.     JAE    SHORT NotSmall1
  855.     MOV    BX,BP
  856. NotSmall1:
  857.     MOV    [DI.AMIGA],BX
  858.     SHL    BX,1
  859.     MOV    AX,[FREQ_TABLE+BX]
  860.     MOV    [DI.FREQ_VAL],AX
  861.     JMP    NoEFFECT
  862. PortDown:
  863.     XCHG    AL,AH
  864.     XOR    AH,AH
  865.     MOV    SI,[DI.FINE]
  866.     MOV    BP,[PERIOD_TABLE+SI]
  867.     MOV    BX,[DI.AMIGA]
  868.     ADD    BX,AX
  869.     CMP    BX,BP
  870.     JBE    SHORT NotBig1
  871.     MOV    BX,BP
  872. NotBig1:
  873.     MOV    [DI.AMIGA],BX
  874.     SHL    BX,1
  875.     MOV    AX,[FREQ_TABLE+BX]
  876.     MOV    [DI.FREQ_VAL],AX
  877.     JMP    NoEFFECT
  878. PORT_TOTone:
  879.     XCHG    AL,AH
  880.     XOR    AH,AH
  881. GOTO_PORT_TO:
  882.     MOV    DX,[DI.PORT_TO]
  883.     MOV    BX,[DI.AMIGA]
  884.     CMP    BX,DX
  885.     JAE    SHORT NoPORT_TOUp
  886.     ADD    BX,AX
  887.     CMP    BX,DX
  888.     JBE    SHORT NoPORT_TOUp
  889.     MOV    [DI.AMIGA],DX
  890. NoPORT_TOUp:
  891.     CMP    BX,DX
  892.     JBE    SHORT NoPORT_TODown
  893.     SUB    BX,AX
  894.     JNC    SHORT NoPORT_TOError
  895.     MOV    BX,DX
  896. NoPORT_TOError:
  897.     CMP    BX,DX
  898.     JAE    SHORT NoPORT_TODown
  899.     MOV    BX,DX
  900. NoPORT_TODown:
  901.     MOV    [DI.AMIGA],BX
  902.     SHL    BX,1
  903.     MOV    AX,[FREQ_TABLE+BX]
  904.     MOV    [DI.FREQ_VAL],AX
  905.     JMP    NoEFFECT
  906. Vibrato:
  907.     MOV    SI,[DI.FINE]
  908.     MOV    BP,[PERIOD_TABLE+47*2+SI]    ;35
  909.     MOV    SI,[PERIOD_TABLE+SI]
  910.     MOV    DL,AH
  911.     AND    AH,0F0H
  912.     SHR    AH,2
  913.     AND    DL,0FH
  914.     MOV    BL,BYTE PTR [DI.VIBRATO_POINT]
  915.     ADD    BL,AH
  916.     MOV    BYTE PTR [DI.VIBRATO_POINT],BL
  917.     SHR    BL,2
  918.     AND    BX,1Fh
  919.     MOV    AL,[SIN_TAB+BX]
  920.     MUL    DL
  921.     ROL    AX,1
  922.     XCHG    AL,AH
  923.     AND    AH,1
  924.     TEST    BYTE PTR [DI.VIBRATO_POINT],80H
  925.     JNE    SHORT VibUp1
  926.     NEG    AX
  927. VibUp1:    ADD    AX,[DI.AMIGA]
  928.     CMP    AX,BP
  929.     JAE    SHORT NoHighVibrato1
  930.     MOV    AX,BP
  931. NoHighVibrato1:
  932.     CMP    AX,SI
  933.     JBE    SHORT NoLowVibrato1
  934.     MOV    AX,SI
  935. NoLowVibrato1:
  936.     SHL    AX,1
  937.     MOV    BX,AX
  938.     MOV    AX,[FREQ_TABLE+BX]
  939.     MOV    [DI.FREQ_VAL],AX
  940.     JMP    NoEFFECT
  941. PORT_TOVSlide:
  942.     MOV    AL,AH
  943.     AND    AH,0FH
  944.     SHR    AL,4
  945.     SUB    AH,AL
  946.     MOV    AL,BYTE PTR [DI.VOL]
  947.     SUB    AL,AH
  948.     JNS    SHORT NoSlideLow2
  949.     XOR    AL,AL
  950. NoSlideLow2:
  951.     CMP    AL,40H
  952.     JBE    SHORT NoSlideHigh2
  953.     MOV    AL,40H
  954. NoSlideHigh2:
  955.     MOV    BYTE PTR [DI.VOL],AL
  956.     MOV    AX,[DI.OLD_PORT_TO]
  957.     JMP    GOTO_PORT_TO
  958. VibratoVSlide:
  959.     MOV    AL,AH
  960.     AND    AH,0FH
  961.     SHR    AL,4
  962.     SUB    AH,AL
  963.     MOV    AL,BYTE PTR [DI.VOL]
  964.     SUB    AL,AH
  965.     JNS    SHORT NoSlideLow3
  966.     XOR    AL,AL
  967. NoSlideLow3:
  968.     CMP    AL,40H
  969.     JBE    SHORT NoSlideHigh3
  970.     MOV    AL,40H
  971. NoSlideHigh3:
  972.     MOV    BYTE PTR [DI.VOL],AL
  973.     JMP    Vibrato
  974. VOLSlide:
  975.     MOV    AL,AH
  976.     AND    AH,0FH
  977.     SHR    AL,4
  978.     OR    AL,AL
  979.     JZ    SHORT NoVOLSlideUp
  980.     NEG    AL
  981.     MOV    AH,AL
  982. NoVOLSlideUp:
  983.     MOV    AL,BYTE PTR [DI.VOL]
  984.     SUB    AL,AH
  985.     JNS    SHORT NoSlideLow1
  986.     XOR    AL,AL
  987. NoSlideLow1:
  988.     CMP    AL,40H
  989.     JBE    SHORT NoSlideHigh1
  990.     MOV    AL,40H
  991. NoSlideHigh1:
  992.     MOV    BYTE PTR [DI.VOL],AL
  993.     JMP    SHORT NoEFFECT
  994. RetrigNote:
  995.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  996.     JNE    SHORT NoRetrig
  997.     MOV    [DI.EFFECT_TIME],0
  998.     MOV    [DI.INST_SET],2
  999. NoRetrig:
  1000.     JMP    SHORT NoEFFECT
  1001. CutNote:
  1002.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  1003.     JNE    SHORT NoCutNote
  1004.     MOV    [DI.AMIGA],0
  1005.     MOV    [DI.FREQ_VAL],0
  1006. NoCutNote:
  1007.     JMP    SHORT NoEFFECT
  1008. DelayNote:
  1009.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  1010.     JNE    SHORT NoDelayNote
  1011.     MOV    [DI.INST_SET],2
  1012.     MOV    [DI.VIBRATO_POINT],0
  1013.     MOV    BX,[DI.PORT_TO]
  1014.     MOV    [DI.AMIGA],BX
  1015.     SHL    BX,1
  1016.     MOV    BX,[FREQ_TABLE+BX]
  1017.     MOV    [DI.FREQ_VAL],BX
  1018. NoDelayNote:
  1019.     JMP    SHORT NoEFFECT
  1020. NoEFFECT:
  1021.     ADD    DI,CHAN_SIZE
  1022.     DEC    CX
  1023.     JNZ    EFFECTLoop
  1024.     JMP    EndPattern
  1025. ;-----------------------------------------------------------------------------
  1026. DoPattern:
  1027.     MOV    AX,PATT_SPEED
  1028.     MOV    PATT_COUNT,AX
  1029.     CMP    PATT_ROW,64
  1030.     JB    SHORT NoPatternWrap
  1031.     MOV    AX,PATT_CURRENT
  1032.     CMP    AL,SONG_SIZE
  1033.     JB    SHORT NoTrackWrap
  1034.     MOV    AL,SONG_LOOP
  1035.     CMP    AL,SONG_SIZE
  1036.     JB    SHORT NoRestart
  1037.     MOV    MOD_STAT,3
  1038.     XOR    AL,AL
  1039. NoRestart:
  1040.     MOV    PATT_CURRENT,AX
  1041. NoTrackWrap:
  1042.     MOV    BX,PATT_CURRENT
  1043.     INC    PATT_CURRENT
  1044.     MOV    DI,OFFSET SAMP_CHANS
  1045.     XOR    SI,SI
  1046. NewTracks:
  1047.     PUSH    SI
  1048.     SHL    SI,1
  1049.     MOV    SI,[TRACKS_OFFSET+SI]
  1050.     MOV    AX,PATT_BREAK
  1051.     MOV    PATT_ROW,AX
  1052.     SHL    AX,2
  1053.     ADD    AH,[SI+BX]
  1054.     MOV    [DI.TRACK_OFF],AX
  1055.     POP    SI
  1056.     ADD    DI,CHAN_SIZE
  1057.     INC    SI
  1058.     CMP    SI,CH_NUMB
  1059.     JB    NewTracks
  1060.     MOV    PATT_BREAK,0
  1061. NoPatternWrap:
  1062.     MOV    ES,TRACK_SEG
  1063.     MOV    DI,OFFSET SAMP_CHANS
  1064.     MOV    CX,CH_NUMB
  1065. PattLoop:
  1066.     MOV    SI,[DI.TRACK_OFF]
  1067.     MOV    AX,[DI.VOL]
  1068.     MOV    [DI.OLD_VOL],AX
  1069.     MOV    BH,ES:[SI]        ; New Sample
  1070.     MOV    BL,ES:[SI+2]
  1071.     AND    BH,0F0H
  1072.     SHR    BL,4
  1073.     ADD    BL,BH
  1074.     JZ    SHORT NoNewSample
  1075.     MOV    BH,BYTE PTR [DI.CURR_SAMP]
  1076.     MOV    BYTE PTR [DI.OLD_SAMP],BH
  1077.     MOV    BYTE PTR [DI.CURR_SAMP],BL
  1078.     XOR    BH,BH
  1079.     DEC    BX
  1080.     SHL    BX,1
  1081.     MOV    AX,[IVOLUME+BX]
  1082.     MOV    [DI.VOL],AX
  1083.     MOV    [DI.INST_SET],1
  1084.     SHL    BX,1
  1085.     MOV    EAX,[IOFFSET+BX]
  1086.     MOV    [DI.SAMP_OFF],EAX
  1087.     SHR    BX,1
  1088.     MOV    AX,[IFINETUNE+BX]
  1089.     SHL    AX,5
  1090.     MOV    [DI.FINE],AX
  1091.     SHL    AX,1
  1092.     ADD    [DI.FINE],AX
  1093.     MOV    [DI.LOOP_ONOFF],0
  1094.     MOV    AX,[ISIZE+BX]
  1095.     MOV    [DI.LEN],AX
  1096.     MOV    AX,[ILOOP_START+BX]
  1097.     MOV    [DI.REPEAT],AX
  1098.     MOV    AX,[ILOOP_SIZE+BX]
  1099.     MOV    [DI.REPLEN],AX
  1100.     CMP    AX,2
  1101.     JBE    SHORT NoNewSample
  1102.     MOV    [DI.LOOP_ONOFF],8
  1103.     MOV    AX,[DI.REPEAT]
  1104.     ADD    AX,[DI.REPLEN]
  1105.     CMP    AX,[DI.LEN]
  1106.     JA    SHORT NoNewSample
  1107.     MOV    [DI.LEN],AX
  1108. NoNewSample:
  1109.     MOV    BX,ES:[SI]
  1110.     XCHG    BL,BH
  1111.     AND    BX,0FFFH
  1112.     JZ    SHORT NoNewNote
  1113.     CALL    GET_PERIOD_INDEX
  1114.     ADD    BX,[DI.FINE]
  1115.     MOV    BX,[PERIOD_TABLE+BX]
  1116.     MOV    [DI.PORT_TO],BX
  1117.     MOV    AX,ES:[SI+2]
  1118.     AND    AL,0FH
  1119.     AND    AH,0F0H
  1120.     CMP    AL,3
  1121.     JE    SHORT NoNewNote
  1122.     CMP    AL,5
  1123.     JE    SHORT NoNewNote
  1124.     CMP    AX,0D00EH
  1125.     JNE    SHORT NewNote
  1126.     MOV    AL,ES:[SI+2]
  1127.     OR    AL,AL
  1128.     JZ    SHORT NewNote
  1129.     MOV    [DI.INST_SET],0
  1130.     JMP    SHORT NoNewNote
  1131. NewNote:
  1132.     MOV    [DI.INST_SET],2
  1133.     MOV    [DI.VIBRATO_POINT],0
  1134.     MOV    [DI.AMIGA],BX
  1135.     SHL    BX,1
  1136.     MOV    BX,[FREQ_TABLE+BX]
  1137.     MOV    [DI.FREQ_VAL],BX
  1138. NoNewNote:
  1139.     MOV    [DI.ARP_COUNTER],0
  1140.     MOV    AX,ES:[SI+2]
  1141.     AND    AL,0FH
  1142.     MOV    [DI.EFFECT],AX
  1143.     CMP    AL,7
  1144.     JB    SHORT NoSetOldFreq
  1145.     MOV    BX,AX
  1146.     AND    BH,0F0H
  1147.     CMP    BX,0C00EH
  1148.     JE    SHORT NoSetOldFreq
  1149.     CMP    BX,0D00EH
  1150.     JE    SHORT NoSetOldFreq
  1151.     MOV    BX,[DI.AMIGA]
  1152.     SHL    BX,1
  1153.     MOV    BX,[FREQ_TABLE+BX]
  1154.     MOV    [DI.FREQ_VAL],BX
  1155. NoSetOldFreq:
  1156.     MOVZX    BX,AL
  1157.     CMP    BL,0EH
  1158.     JE    SHORT DoEPattEFFECTs
  1159.     SHL    BX,1
  1160.     JMP    [PattJumps+BX]
  1161. DoEPattEFFECTs:
  1162.     MOV    BL,AH
  1163.     AND    AH,0FH
  1164.     SHR    BL,4
  1165.     SHL    BX,1
  1166.     JMP    [EPattJumps+BX]
  1167. ARPeggioFix:
  1168.     MOV    BX,[DI.AMIGA]
  1169.     CALL    GET_PERIOD_INDEX
  1170.     MOV    BP,BX
  1171.     ADD    BX,[DI.FINE]
  1172.     MOV    DX,[PERIOD_TABLE+BX]
  1173.     MOV    [DI.ARP],DX
  1174.     XCHG    AL,AH
  1175.     XOR    AH,AH
  1176.     MOV    DX,AX
  1177.     SHR    DX,4
  1178.     AND    AX,0FH
  1179.     SHL    DX,1
  1180.     SHL    AX,1
  1181.     MOV    BX,BP
  1182.     ADD    BX,DX
  1183.     CMP    BX,94
  1184.     JBE    SHORT NoWrapARP1
  1185.     MOV    BX,94
  1186. NoWrapARP1:
  1187.     ADD    BX,[DI.FINE]
  1188.     MOV    DX,[PERIOD_TABLE+BX]
  1189.     MOV    [DI.ARP+2],DX
  1190.     MOV    BX,BP
  1191.     ADD    BX,AX
  1192.     CMP    BX,94
  1193.     JBE    SHORT NoWrapARP2
  1194.     MOV    BX,94
  1195. NoWrapARP2:
  1196.     ADD    BX,[DI.FINE]
  1197.     MOV    DX,[PERIOD_TABLE+BX]
  1198.     MOV    [DI.ARP+4],DX
  1199.     JMP    NoPattEFFECT
  1200. PORT_TOFix:
  1201.     OR    AH,AH
  1202.     JNZ    SHORT NoPortPekFix
  1203.     MOV    AH,BYTE PTR [DI.OLD_PORT_TO]
  1204. NoPortPekFix:
  1205.     MOV    BYTE PTR [DI.OLD_PORT_TO],AH
  1206.     MOV    BYTE PTR [DI.EFFECT+1],AH
  1207.     JMP    NoPattEFFECT
  1208. VibratoFix:
  1209.     MOV    AL,AH
  1210.     AND    AL,0FH
  1211.     AND    AH,0F0H
  1212.     OR    AL,AL
  1213.     JNZ    SHORT NoVibratoFix1
  1214.     MOV    AL,BYTE PTR [DI.OLD_VIBRATO]
  1215. NoVibratoFix1:
  1216.     OR    AH,AH
  1217.     JNZ    SHORT NoVibratoFix2
  1218.     MOV    AH,BYTE PTR [DI.OLD_VIBRATO+1]
  1219. NoVibratoFix2:
  1220.     MOV    BYTE PTR [DI.OLD_VIBRATO],AL
  1221.     MOV    BYTE PTR [DI.OLD_VIBRATO+1],AH
  1222.     OR    AL,AH
  1223.     MOV    BYTE PTR [DI.EFFECT+1],AL
  1224.     JMP    NoPattEFFECT
  1225. SampleOff:
  1226.     XOR    AL,AL
  1227.     CMP    AX,[DI.LEN]
  1228.     JB    SHORT NoFixOffset
  1229.     MOV    AX,[DI.LEN]
  1230.     DEC    AX
  1231. NoFixOffset:
  1232.     MOV    [DI.OFFSET_ADD],AX
  1233.     JMP    NoPattEFFECT
  1234. PosJump:
  1235.     MOV    [PATT_ROW],63
  1236.     MOV    BYTE PTR [PATT_CURRENT],AH
  1237.     JMP    NoPattEFFECT
  1238. VOLume:
  1239.     CMP    AH,40H
  1240.     JBE    SHORT NoFixVOL1
  1241.     MOV    AH,40H
  1242. NoFixVOL1:
  1243.     MOV    BYTE PTR [DI.VOL],AH
  1244.     JMP    NoPattEFFECT
  1245. BreakPatt:
  1246.     MOV    [PATT_ROW],63
  1247.     CMP    AH,64H
  1248.     JB    SHORT NoFixBreak
  1249.     MOV    AH,63H
  1250. NoFixBreak:
  1251.     MOV    AL,AH
  1252.     AND    AL,0FH
  1253.     SHR    AH,4
  1254.     SHL    AH,1
  1255.     MOV    BYTE PTR [PATT_BREAK],AL
  1256.     ADD    BYTE PTR [PATT_BREAK],AH
  1257.     SHL    AH,2
  1258.     ADD    BYTE PTR [PATT_BREAK],AH
  1259.     JMP    NoPattEFFECT
  1260. SpeedSet:
  1261.     OR    AH,AH
  1262.     JZ    NoPattEFFECT
  1263.     CMP    AH,1FH
  1264.     JBE    SHORT UsualSpeed
  1265.     XCHG    AL,AH
  1266.     XOR    AH,AH
  1267.     SHL    AX,1
  1268.     MOV    BL,5
  1269.     DIV    BL            ; EFFECTS 50Hz
  1270.     MOV    DL,AL
  1271.     XOR    DH,DH            ; PATT_SPEED Hz=2*BPM/5
  1272.     XOR    AX,AX
  1273.     MOV    BX,1024
  1274.     DIV    BX
  1275.     MOV    WORD PTR BPM_SPEED,AX
  1276.     XOR    AX,AX
  1277.     DIV    BX
  1278.     MOV    WORD PTR BPM_SPEED+2,AX
  1279.     JMP    SHORT NoPattEFFECT
  1280. UsualSpeed:
  1281.     MOV    BYTE PTR [PATT_SPEED],AH
  1282.     MOV    BYTE PTR [PATT_COUNT],AH
  1283.     JMP    SHORT NoPattEFFECT
  1284. FINEPortUp:
  1285.     XCHG    AL,AH
  1286.     XOR    AH,AH
  1287.     SUB    [DI.AMIGA],AX
  1288.     MOV    BX,[DI.FINE]
  1289.     MOV    BX,[PERIOD_TABLE+47*2+BX] ;35
  1290.     CMP    [DI.AMIGA],BX
  1291.     JAE    SHORT NoFixFINEUp
  1292.     MOV    [DI.AMIGA],BX
  1293. NoFixFINEUp:
  1294.     JMP    SHORT NoPattEFFECT
  1295. FINEPortDown:
  1296.     XCHG    AL,AH
  1297.     XOR    AH,AH
  1298.     ADD    [DI.AMIGA],AX
  1299.     MOV    BX,[DI.FINE]
  1300.     MOV    BX,[PERIOD_TABLE+BX]
  1301.     CMP    [DI.AMIGA],BX
  1302.     JBE    SHORT NoFixFINEDown
  1303.     MOV    [DI.AMIGA],BX
  1304. NoFixFINEDown:
  1305.     JMP    SHORT NoPattEFFECT
  1306. PANNING:
  1307.     AND    [DI.BALANCE],0F0H
  1308.     OR    [DI.BALANCE],AH
  1309.     JMP    SHORT NoPattEFFECT
  1310. FINEVOLUP:
  1311.     ADD    BYTE PTR [DI.VOL],AH
  1312.     CMP    BYTE PTR [DI.VOL],40H
  1313.     JBE    SHORT NoFixFINEVOLUp
  1314.     MOV    BYTE PTR [DI.VOL],40H
  1315. NoFixFINEVOLUp:
  1316.     JMP    SHORT NoPattEFFECT
  1317. FINEVOLDown:
  1318.     SUB    BYTE PTR [DI.VOL],AH
  1319.     JNC    SHORT NoFixFINEVOLDown
  1320.     MOV    BYTE PTR [DI.VOL],0
  1321. NoFixFINEVOLDown:
  1322.     JMP    SHORT NoPattEFFECT
  1323. NoPattEFFECT:
  1324.     ADD    [DI.TRACK_OFF],4
  1325.     MOV    [DI.EFFECT_TIME],0
  1326.     ADD    DI,CHAN_SIZE
  1327.     DEC    CX
  1328.     JNZ    PattLoop
  1329.     INC    PATT_ROW
  1330. EndPattern:
  1331.     CALL    CONTROL_SAMPLE
  1332.     POP    ES DS
  1333.     POP    EBP EDI ESI EDX ECX EBX EAX
  1334.     CMP    CS:SYSTEM,0
  1335.     JE    SHORT WT7
  1336.     DEC    CS:IRQCOUNT
  1337.     JNZ    SHORT WT7
  1338.     MOV    CS:IRQCOUNT,56
  1339.     JMP    DWORD PTR CS:[HOLD70]
  1340. WT7:    IRET
  1341. CONTROL_CHANNELS ENDP
  1342. ;-----------------------------------------------------------------------------
  1343. GET_PERIOD_INDEX PROC NEAR
  1344.     MOV    BP,BX
  1345.     XOR    BH,BH
  1346.     MOV    DX,6000H        ;BINARY SEARCH
  1347. LGP1:    MOV    BL,DL
  1348.     ADD    BL,DH
  1349.     SHR    BL,1
  1350.     AND    BL,0FEH
  1351.     JZ    SHORT GGP2
  1352.     CMP    BL,94
  1353.     JE    SHORT GGP2
  1354.     CMP    BP,[PERIOD_TABLE+BX]
  1355.     JAE    SHORT GGP1
  1356.     MOV    DL,BL
  1357.     JMP    LGP1
  1358. GGP1:    MOV    DH,BL
  1359.     CMP    BP,[PERIOD_TABLE-2+BX]
  1360.     JAE    LGP1            ;FOUND
  1361.     MOV    DX,[PERIOD_TABLE-2+BX]    ;GET NEAREST PERIOD
  1362.     SUB    DX,BP
  1363.     SUB    BP,[PERIOD_TABLE+BX]
  1364.     CMP    DX,BP
  1365.     JAE    SHORT GGP2
  1366.     SUB    BX,2
  1367. GGP2:    RET
  1368. GET_PERIOD_INDEX ENDP
  1369. ;-----------------------------------------------------------------------------
  1370. CONTROL_SAMPLE PROC NEAR
  1371.     MOV    CL,8
  1372.     XOR    SI,SI
  1373. LCS1:    CMP    [SAM_COUNT+SI],0
  1374.     JE    SHORT GCS1
  1375.     JL    SHORT GCS2
  1376.     DEC    [SAM_COUNT+SI]
  1377.     JNZ    SHORT GCS1
  1378.     MOV    [SAM_COUNT+SI],-256    ;RAMP DOWN SAMPLE
  1379.     MOV    DX,BASE_PORT
  1380.     ADD    DX,CommandPort
  1381.     DEC    DX
  1382.     MOV    AL,CL
  1383.     OUT    DX,AL
  1384.     INC    DX
  1385.     MOV    BP,GUS_VOL
  1386.     MOV    BX,FX_VOL
  1387.     INC    BX
  1388.     SHR    BX,2
  1389.     CMP    BL,40H
  1390.     JBE    SHORT FIXVOL
  1391.     MOV    BL,40H
  1392. FIXVOL:    SHL    BX,1
  1393.     MOV    BX,[GUS_VOL+BX]
  1394.     CALL    SEND_RAMP
  1395.     JMP    SHORT GCS1
  1396. GCS2:    INC    [SAM_COUNT+SI]        ;STOP SAMPLE
  1397.     JNZ    SHORT GCS1
  1398.     MOV    DX,BASE_PORT
  1399.     ADD    DX,ActiveVoicePort
  1400.     MOV    AL,CL
  1401.     OUT    DX,AL
  1402.     INC    DX
  1403.     MOV    AL,WriteVoiceMode
  1404.     OUT    DX,AL
  1405.     ADD    DX,2
  1406.     MOV    AL,3            ;Voice Off
  1407.     OUT    DX,AL
  1408.     SUB    DX,2
  1409.     MOV    AL,VolumeCtrl
  1410.     OUT    DX,AL
  1411.     ADD    DX,2
  1412.     MOV    AL,3            ;Ramp Off
  1413.     OUT    DX,AL
  1414.     SUB    DX,3
  1415. GCS1:    INC    SI
  1416.     INC    SI
  1417.     INC    CL
  1418.     CMP    CL,13
  1419.     JB    LCS1
  1420.     RET
  1421. CONTROL_SAMPLE ENDP
  1422. ;=============================================================================
  1423.  
  1424.  
  1425. ;=============================================================================
  1426. ;
  1427. ; ULTRASOUND INIT
  1428. ;
  1429. ;=============================================================================
  1430. INIT_DEVICE PROC NEAR
  1431.     PUSH    CS
  1432.     POP    DS
  1433.     CLI
  1434.     MOV    BX,BASE_PORT        ;Init the UltraSound
  1435.     MOV    CX,BX
  1436.     ADD    BX,CommandPort
  1437.     ADD    CX,DataHighPort
  1438.     MOV    DX,BX
  1439.     MOV    AL,Initialize
  1440.     OUT    DX,AL
  1441.     MOV    DX,CX
  1442.     MOV    AL,0
  1443.     OUT    DX,AL
  1444.     MOV    DX,BASE_PORT
  1445.     MOV    AH,10
  1446. LID1:    IN    AL,DX
  1447.     DEC    AH
  1448.     JNZ    LID1
  1449.     MOV    DX,BX
  1450.     MOV    AL,Initialize
  1451.     OUT    DX,AL
  1452.     MOV    DX,CX
  1453.     MOV    AL,1
  1454.     OUT    DX,AL
  1455.     MOV    DX,BASE_PORT
  1456.     MOV    AH,10
  1457. LID2:    IN    AL,DX
  1458.     DEC    AH
  1459.     JNZ    LID2
  1460.     MOV    DX,BX
  1461.     MOV    AL,DMACtrl
  1462.     OUT    DX,AL
  1463.     MOV    DX,CX
  1464.     MOV    AL,0
  1465.     OUT    DX,AL
  1466.     MOV    DX,BX
  1467.     MOV    AL,45H
  1468.     OUT    DX,AL
  1469.     MOV    DX,CX
  1470.     MOV    AL,0
  1471.     OUT    DX,AL
  1472.     MOV    DX,BX
  1473.     MOV    AL,49H
  1474.     OUT    DX,AL
  1475.     MOV    DX,CX
  1476.     MOV    AL,0
  1477.     OUT    DX,AL
  1478.  
  1479.     MOV    DX,BX
  1480.     MOV    AL,VoicesActive
  1481.     OUT    DX,AL
  1482.     MOV    DX,CX
  1483.     MOV    AL,NumVoices
  1484.     DEC    AL
  1485.     OR    AL,0C0H
  1486.     OUT    DX,AL
  1487.  
  1488.     MOV    DX,BASE_PORT        ;Clear IRQs
  1489.     ADD    DX,StatusPort
  1490.     IN    AL,DX
  1491.     MOV    DX,BX
  1492.     MOV    AL,DMACtrl
  1493.     OUT    DX,AL
  1494.     MOV    DX,CX
  1495.     IN    AL,DX
  1496.     MOV    DX,BX
  1497.     MOV    AL,49H
  1498.     OUT    DX,AL
  1499.     MOV    DX,CX
  1500.     IN    AL,DX
  1501.     MOV    DX,BX
  1502.     MOV    AL,8FH
  1503.     OUT    DX,AL
  1504.     MOV    DX,CX
  1505.     IN    AL,DX
  1506.  
  1507.     PUSH    CX
  1508.     MOV    CX,32
  1509. VoiceClearLoop:
  1510.     MOV    DX,BASE_PORT
  1511.     ADD    DX,ActiveVoicePort
  1512.     MOV    AL,CL
  1513.     DEC    AL
  1514.     OUT    DX,AL
  1515.     INC    DX
  1516.     MOV    AL,0
  1517.     OUT    DX,AL
  1518.     ADD    DX,2
  1519.     MOV    AL,3            ;Voice Off
  1520.     OUT    DX,AL
  1521.     SUB    DX,2
  1522.     MOV    AL,0DH
  1523.     OUT    DX,AL
  1524.     ADD    DX,2
  1525.     MOV    AL,3            ;Ramp Off
  1526.     OUT    DX,AL
  1527.     MOV    DX,BASE_PORT
  1528.     MOV    AH,10
  1529. LID3:    IN    AL,DX
  1530.     DEC    AH
  1531.     JNZ    LID3
  1532.     LOOP    VoiceClearLoop
  1533.     POP    CX
  1534.  
  1535.     CMP    DMA_CHANNEL,0        ;NO DMA
  1536.     JE    SHORT LID5
  1537.     MOV    DX,BASE_PORT        ;SETUP FOR DIGITAL ASIC
  1538.     ADD    DX,0FH
  1539.     MOV    AL,5
  1540.     OUT    DX,AL
  1541.     SUB    DX,0FH
  1542.     MOV    AL,3
  1543.     OUT    DX,AL
  1544.     ADD    DX,DMASetPort
  1545.     MOV    AL,0
  1546.     OUT    DX,AL
  1547.     ADD    DX,0FH-DMASetPort
  1548.     OUT    DX,AL
  1549.     SUB    DX,0FH
  1550.     MOV    AL,3            ;SET DMA CHANNEL
  1551.     OUT    DX,AL
  1552.     ADD    DX,DMASetPort
  1553.     PUSH    BX
  1554.     MOV    BX,DMA_CHANNEL
  1555.     MOV    AL,[DMA_SET_DATA+BX]
  1556.     POP    BX
  1557.     OR    AL,0C0H            ;SET DMA
  1558.     OUT    DX,AL
  1559.     SUB    DX,DMASetPort
  1560.     PUSH    AX
  1561.     MOV    AL,43H
  1562.     OUT    DX,AL
  1563.     ADD    DX,DMASetPort
  1564.     MOV    AL,45H            ;SET IRQ11
  1565.     OUT    DX,AL
  1566.     SUB    DX,DMASetPort
  1567.     MOV    AL,3
  1568.     OUT    DX,AL
  1569.     ADD    DX,DMASetPort
  1570.     POP    AX
  1571.     AND    AL,7FH            ;SET DMA
  1572.     OUT    DX,AL
  1573.     SUB    DX,DMASetPort
  1574.     MOV    AL,43H
  1575.     OUT    DX,AL
  1576.     ADD    DX,DMASetPort
  1577.     MOV    AL,45H            ;SET IRQ11
  1578.     OUT    DX,AL
  1579.     ADD    DX,ActiveVoicePort-DMASetPort
  1580.     MOV    AL,0
  1581.     OUT    DX,AL
  1582.     SUB    DX,ActiveVoicePort
  1583.     MOV    AL,9            ;SETUP DMA LATCH
  1584.     OUT    DX,AL
  1585.     ADD    DX,ActiveVoicePort
  1586.     MOV    AL,0
  1587.     OUT    DX,AL
  1588. LID5:
  1589.     MOV    DX,BX            ;Clear IRQs
  1590.     MOV    AL,DMACtrl
  1591.     OUT    DX,AL
  1592.     MOV    DX,CX
  1593.     IN    AL,DX
  1594.     MOV    DX,BX
  1595.     MOV    AL,49H
  1596.     OUT    DX,AL
  1597.     MOV    DX,CX
  1598.     IN    AL,DX
  1599.     MOV    DX,BX
  1600.     MOV    AL,8FH
  1601.     OUT    DX,AL
  1602.     MOV    DX,CX
  1603.     IN    AL,DX
  1604.  
  1605.     MOV    DX,BX
  1606.     MOV    AL,Initialize
  1607.     OUT    DX,AL
  1608.     MOV    DX,CX
  1609.     MOV    AL,3
  1610.     OUT    DX,AL
  1611.  
  1612.     MOV    CX,NumVoices
  1613. SetRampRateLoop:
  1614.     MOV    DX,BASE_PORT
  1615.     ADD    DX,ActiveVoicePort
  1616.     MOV    AL,NumVoices
  1617.     SUB    AL,CL
  1618.     OUT    DX,AL
  1619.  
  1620.     MOV    DX,BASE_PORT
  1621.     ADD    DX,CommandPort
  1622.     MOV    AL,VOLRampRate
  1623.     OUT    DX,AL
  1624.     MOV    AL,00111111B
  1625.     MOV    DX,BASE_PORT
  1626.     ADD    DX,DataHighPort
  1627.     OUT    DX,AL
  1628.  
  1629.     MOV    DX,BASE_PORT
  1630.     ADD    DX,CommandPort
  1631.     MOV    AL,SetVOLume
  1632.     OUT    DX,AL
  1633.     MOV    AX,GUS_VOL
  1634.     MOV    DX,BASE_PORT
  1635.     ADD    DX,DataLowPort
  1636.     OUT    DX,AX
  1637.     MOV    DX,BASE_PORT
  1638.     MOV    AH,10
  1639. LID4:    IN    AL,DX
  1640.     DEC    AH
  1641.     JNZ    LID4
  1642.     LOOP    SetRampRateLoop
  1643.     STI
  1644.     RET
  1645. INIT_DEVICE ENDP
  1646. ;-----------------------------------------------------------------------------
  1647. SEND_SAMPLE_START PROC NEAR
  1648.     MOV    AL,SampleStartLo
  1649.     OUT    DX,AL
  1650.     INC    DX
  1651.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1652.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1653.     ADD    AX,[DI.OFFSET_ADD]
  1654.     ADC    BP,0
  1655.     SHR    AX,7
  1656.     SHL    BP,9
  1657.     OR    AX,BP
  1658.     OUT    DX,AX
  1659.     DEC    DX
  1660.     MOV    AL,SampleStartHi
  1661.     OUT    DX,AL
  1662.     INC    DX
  1663.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1664.     ADD    AX,[DI.OFFSET_ADD]
  1665.     SHL    AX,9
  1666.     OUT    DX,AX
  1667.     DEC    DX
  1668.     SUB    DX,CommandPort
  1669.     Rept    6
  1670.     IN    AL,DX
  1671.     EndM
  1672.     ADD    DX,CommandPort
  1673.     RET
  1674. SEND_SAMPLE_START ENDP
  1675. ;-----------------------------------------------------------------------------
  1676. SEND_SAMPLE_END PROC NEAR
  1677.     MOV    AL,SampleEndLo
  1678.     OUT    DX,AL
  1679.     INC    DX
  1680.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1681.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1682.     ADD    AX,[DI.LEN]
  1683.     ADC    BP,0
  1684.     SHR    AX,7
  1685.     SHL    BP,9
  1686.     OR    AX,BP
  1687.     OUT    DX,AX
  1688.     DEC    DX
  1689.     MOV    AL,SampleEndHi
  1690.     OUT    DX,AL
  1691.     INC    DX
  1692.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1693.     ADD    AX,[DI.LEN]
  1694.     SHL    AX,9
  1695.     OUT    DX,AX
  1696.     DEC    DX
  1697.     RET
  1698. SEND_SAMPLE_END ENDP
  1699. ;-----------------------------------------------------------------------------
  1700. SEND_SAMPLE_LOOP PROC NEAR
  1701.     MOV    AL,LoopStartLo
  1702.     OUT    DX,AL
  1703.     INC    DX
  1704.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1705.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1706.     ADD    AX,[DI.REPEAT]
  1707.     ADC    BP,0
  1708.     SHR    AX,7
  1709.     SHL    BP,9
  1710.     OR    AX,BP
  1711.     OUT    DX,AX
  1712.     DEC    DX
  1713.     MOV    AL,LoopStartHi
  1714.     OUT    DX,AL
  1715.     INC    DX
  1716.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1717.     ADD    AX,[DI.REPEAT]
  1718.     SHL    AX,9
  1719.     OUT    DX,AX
  1720.     DEC    DX
  1721.     RET
  1722. SEND_SAMPLE_LOOP ENDP
  1723. ;-----------------------------------------------------------------------------
  1724. SEND_WRITE_VOICE PROC NEAR
  1725.     MOV    AL,WriteVoiceMode
  1726.     OUT    DX,AL
  1727.     ADD    DX,2
  1728.     MOV    AL,AH
  1729.     OUT    DX,AL
  1730.     SUB    DX,2
  1731.     RET
  1732. SEND_WRITE_VOICE ENDP
  1733. ;-----------------------------------------------------------------------------
  1734. WAIT_PORT PROC NEAR
  1735.     SUB    DX,CommandPort
  1736.     Rept    6
  1737.     IN    AL,DX
  1738.     EndM
  1739.     ADD    DX,CommandPort
  1740.     RET
  1741. WAIT_PORT ENDP
  1742. ;-----------------------------------------------------------------------------
  1743. SEND_RAMP PROC NEAR
  1744.     MOV    DX,BASE_PORT
  1745.     ADD    DX,CommandPort
  1746.     MOV    AL,VOLumeCtrl
  1747.     OUT    DX,AL
  1748.     ADD    DX,2
  1749.     MOV    AL,3
  1750.     OUT    DX,AL
  1751.     SUB    DX,2
  1752.     MOV    AH,0
  1753.     CMP    BX,BP
  1754.     JB    SHORT NoFixVOLDir
  1755.     MOV    AH,01000000B
  1756.     XCHG    BX,BP
  1757. NoFixVOLDir:
  1758.     MOV    AL,VOLRampStart
  1759.     OUT    DX,AL
  1760.     XCHG    AX,BX
  1761.     INC    DX
  1762.     OUT    DX,AX
  1763.     DEC    DX
  1764.     MOV    AL,VOLRampEnd
  1765.     OUT    DX,AL
  1766.     MOV    AX,BP
  1767.     INC    DX
  1768.     OUT    DX,AX
  1769.     DEC    DX
  1770.     MOV    AL,VOLumeCtrl
  1771.     OUT    DX,AL
  1772.     MOV    AL,BH
  1773.     ADD    DX,2
  1774.     OUT    DX,AL
  1775.     SUB    DX,2
  1776.     RET
  1777. SEND_RAMP ENDP
  1778. ;-----------------------------------------------------------------------------
  1779. ; CX= NUMBER OF WORDS, EDI= GUSMEM POINTER, BX= 0000H AMIGA, 8080H PC SAMPLE
  1780. ; DS:SI= POINTER TO SAMPLE DATA
  1781. ;-----------------------------------------------------------------------------
  1782. SEND_SAMPLE_DATA PROC NEAR
  1783.     CMP    CS:DMA_CHANNEL,0
  1784.     JNE    DMA_INIT
  1785.     MOV    DX,CS:BASE_PORT
  1786.     ADD    DX,CommandPort
  1787. LHP1:    LODSW
  1788.     CLI
  1789.     XOR    AX,BX
  1790.     MOV    BP,AX
  1791.     MOV    AL,DRAMAddrLo
  1792.     OUT    DX,AL
  1793.     INC    DX
  1794.     MOV    AX,DI
  1795.     OUT    DX,AX
  1796.     DEC    DX
  1797.     MOV    AL,DRAMAddrHi
  1798.     OUT    DX,AL
  1799.     ADD    DX,2
  1800.     MOV    EAX,EDI
  1801.     SHR    EAX,16
  1802.     OUT    DX,AL
  1803.     ADD    DX,2
  1804.     MOV    AX,BP
  1805.     OUT    DX,AL
  1806.     SUB    DX,4
  1807.     INC    EDI
  1808.     MOV    AL,DRAMAddrLo
  1809.     OUT    DX,AL
  1810.     INC    DX
  1811.     MOV    AX,DI
  1812.     OUT    DX,AX
  1813.     DEC    DX
  1814.     MOV    AL,DRAMAddrHi
  1815.     OUT    DX,AL
  1816.     ADD    DX,2
  1817.     MOV    EAX,EDI
  1818.     SHR    EAX,16
  1819.     OUT    DX,AL
  1820.     ADD    DX,2
  1821.     MOV    AX,BP
  1822.     MOV    AL,AH
  1823.     OUT    DX,AL
  1824.     SUB    DX,4
  1825.     INC    EDI
  1826.     STI
  1827.     LOOP    LHP1
  1828.     CLI
  1829.     MOV    AL,DRAMAddrLo        ;MAKE SAMPLE 1 WORD LONGER
  1830.     OUT    DX,AL
  1831.     INC    DX
  1832.     MOV    AX,DI
  1833.     OUT    DX,AX
  1834.     DEC    DX
  1835.     MOV    AL,DRAMAddrHi
  1836.     OUT    DX,AL
  1837.     ADD    DX,2
  1838.     MOV    EAX,EDI
  1839.     SHR    EAX,16
  1840.     OUT    DX,AL
  1841.     ADD    DX,2
  1842.     MOV    AX,BP
  1843.     MOV    AL,AH
  1844.     OUT    DX,AL
  1845.     SUB    DX,4
  1846.     INC    EDI
  1847.     MOV    CS:GUS_MEM,EDI
  1848.     STI
  1849.     RET
  1850. SEND_SAMPLE_DATA ENDP
  1851. ;-----------------------------------------------------------------------------
  1852. ; SET DMA READY FOR TRANSFER WITH AUTOINIT
  1853. ; IN: DS:SI= BLOCKPOINTER, CX= SIZE IN WORDS, EDI, BX WIE OBEN
  1854. ;-----------------------------------------------------------------------------
  1855. DMA_INIT PROC NEAR
  1856.     MOV    DX,CS:BASE_PORT        ;STOP GUS DMA & CLEAR ALL PENDING IRQs
  1857.     ADD    DX,CommandPort
  1858.     MOV    AL,DMACtrl
  1859.     OUT    DX,AL
  1860.     INC    DX
  1861.     INC    DX
  1862.     IN    AL,DX            ;CLEAR IRQ, BUT MASTER IRQ IS DISABLED
  1863.     MOV    DX,CS:BASE_PORT        ;THERE HAPPENED NO IRQ
  1864.     ADD    DX,StatusPort
  1865.     IN    AL,DX
  1866.     MOV    BP,CS:DMA_CHANNEL
  1867.     MOVZX    DX,CS:[DMA_RESET+BP]
  1868.     OUT    DX,AL            ;DMA MASTER CLEAR
  1869.  
  1870.     MOV    BP,BX
  1871.     MOVZX    EAX,CX            ;CHECK 256K GUS DRAM BOUNDARY
  1872.     SHL    EAX,1            ;BECAUSE DMA IS NOT ABLE TO CROSS
  1873.     INC    EAX            ;1 WORD LONGER-1 BYTE IS LAST BYTE
  1874.     ADD    EAX,EDI
  1875.     SHR    EAX,18
  1876.     MOV    EDX,EDI
  1877.     SHR    EDX,18
  1878.     CMP    EAX,EDX
  1879.     JE    SHORT DMA_NORMAL
  1880.     PUSH    SI CX
  1881.     SHL    EAX,18
  1882.     SUB    EAX,EDI
  1883.     MOV    CX,AX
  1884.     SHR    CX,1
  1885.     PUSH    CX
  1886.     DEC    CX
  1887.     CALL    DMA_PORTION        ;FIRST PORTION
  1888.     POP    AX CX SI
  1889.     SUB    CX,AX
  1890.     ADD    SI,AX
  1891.     ADD    SI,AX            ;REST: CORRECT OFFSET & SIZE
  1892. DMA_NORMAL:
  1893.     MOV    BX,CX            ;MAKE SAMPLE 1 WORD LONGER
  1894.     SHL    BX,1
  1895.     DEC    BX
  1896.     MOV    AL,[SI+BX]
  1897.     MOV    AH,AL
  1898.     INC    BX
  1899.     MOV    [SI+BX],AX
  1900. DMA_PORTION:
  1901.     CLI
  1902.     MOV    BX,SI            ;SETUP PC DMA CONTROLLER
  1903.     MOV    DX,DS
  1904.     MOV    AX,DX            ;CONVERT ADDRESS TO PAGE AND OFFSET
  1905.     SHL    DX,4
  1906.     SHR    AH,4            ;PAGE
  1907.     ADD    BX,DX            ;OFFSET NEW
  1908.     ADC    AH,0
  1909.     MOV    AL,AH
  1910.     MOV    SI,CS:DMA_CHANNEL
  1911.     CMP    SI,4
  1912.     JB    SHORT GDMI1
  1913.     SHRD    BX,AX,1            ;ADDRESS FOR 16-BIT DMA
  1914.     JMP    SHORT GDMI2
  1915. GDMI1:    SHL    CX,1            ;COUNTER FOR 8-BIT DMA
  1916.     INC    CX            ;SAMPLE IS 1 WORD LONGER
  1917. GDMI2:    MOVZX    DX,CS:[DMA_MASK+SI]
  1918.     MOV    AL,BYTE PTR CS:DMA_CHANNEL
  1919.     OR    AL,4
  1920.     OUT    DX,AL            ;MASK DMA-CHANNEL
  1921.     MOVZX    DX,CS:[DMA_MOD+SI]
  1922.     AND    AL,3
  1923.     OR    AL,01001000B
  1924.     OUT    DX,AL            ;DMA-MODUS FOR GUS
  1925.     MOVZX    DX,CS:[DMA_FLIP+SI]
  1926.     OUT    DX,AL            ;FLIP-FLOP CLEAR
  1927.     MOVZX    DX,CS:[DMA_ADR+SI]
  1928.     MOV    AL,BL            ;DMA CHANNEL 1-4
  1929.     OUT    DX,AL            ;OFFSET LOW
  1930.     MOV    AL,BH
  1931.     OUT    DX,AL            ;OFFSET HIGH
  1932.     MOVZX    DX,CS:[DMA_CNT+SI]
  1933.     MOV    AL,CL
  1934.     OUT    DX,AL            ;SIZE LOW
  1935.     MOV    AL,CH
  1936.     OUT    DX,AL            ;SIZE HIGH
  1937.     MOVZX    DX,CS:[DMA_PAGE+SI]
  1938.     MOV    AL,AH
  1939.     OUT    DX,AL            ;PAGE
  1940.     MOVZX    DX,CS:[DMA_MASK+SI]
  1941.     MOV    AX,SI
  1942.     AND    AL,3
  1943.     OUT    DX,AL            ;DEMASK DMA-KANAL
  1944.  
  1945.     MOV    DX,CS:BASE_PORT        ;SETUP GUS FOR DMA TRANSFER
  1946.     ADD    DX,CommandPort
  1947.     MOV    AL,DMAAddr        ;SET DMA ADDRESS
  1948.     OUT    DX,AL
  1949.     MOV    EAX,EDI
  1950.     SHR    EAX,4
  1951.     CMP    SI,4
  1952.     JB    SHORT GDMI3
  1953.     MOV    BX,AX            ;CONVERT FOR 16-BIT TRANSFER
  1954.     AND    AX,03FFFH
  1955.     SHR    AX,1
  1956.     AND    BX,0C000H
  1957.     OR    AX,BX
  1958. GDMI3:    INC    DX    
  1959.     OUT    DX,AX
  1960.     DEC    DX
  1961.     MOV    AL,DMACtrl
  1962.     OUT    DX,AL
  1963.     INC    DX
  1964.     INC    DX
  1965.     MOV    AX,SI
  1966.     AND    AL,4            ;SELECT 8/16-BIT CHANNEL
  1967.     OR    AX,BP            ;SELECT AMIGA/PC
  1968.     OR    AL,00100001B        ;START DMA TRANSFER
  1969.     OUT    DX,AL
  1970.     STI
  1971.     MOVZX    DX,CS:[DMA_STAT+SI]
  1972.     MOV    AH,CS:[DMA_BITS+SI]
  1973.     MOV    EBX,800000H        ;TIMEOUT
  1974. GDMI4:    DEC    EBX
  1975.     JZ    SHORT GDMI5
  1976.     OR    BL,BL
  1977.     JNZ    GDMI4
  1978.     IN    AL,DX            ;WAIT FOR TRANSFER END
  1979.     TEST    AL,AH
  1980.     JZ    GDMI4
  1981. GDMI5:    MOV    DX,CS:BASE_PORT        ;STOP GUS DMA
  1982.     ADD    DX,CommandPort
  1983.     MOV    AL,DMACtrl
  1984.     OUT    DX,AL
  1985.     INC    DX
  1986.     INC    DX
  1987.     IN    AL,DX            ;CLEAR IRQ, BUT MASTER IRQ IS DISABLED
  1988.     MOV    DX,CS:BASE_PORT        ;THERE HAPPENED NO IRQ
  1989.     ADD    DX,StatusPort
  1990.     IN    AL,DX
  1991.     MOVZX    DX,CS:[DMA_RESET+SI]
  1992.     OUT    DX,AL            ;DMA MASTER CLEAR
  1993.     AND    ECX,0FFFFH        ;INCREASE GUSMEM-POINTER
  1994.     INC    CX
  1995.     CMP    SI,4
  1996.     JB    SHORT GDMI6
  1997.     SHL    CX,1
  1998. GDMI6:    ADD    EDI,ECX
  1999.     MOV    CS:GUS_MEM,EDI
  2000.     RET
  2001. DMA_INIT ENDP
  2002. ;=============================================================================
  2003.  
  2004.  
  2005. ;=============================================================================
  2006. PLAY_MUSIC PROC NEAR
  2007.     PUSH    CS
  2008.     POP    DS
  2009.     CLI
  2010.     MOV    SI,54*2
  2011.     MOV    EBP,54
  2012.     MOV    CX,908-54+1
  2013. CountLoop:
  2014.     XOR    EDX,EDX
  2015.     MOV    EAX,369DE4H
  2016.     DIV    EBP
  2017.     MOV    EDX,100
  2018.     MUL    EDX
  2019.     MOV    EBX,Voices14
  2020.     DIV    EBX
  2021.     SHR    BX,1
  2022.     ADC    BX,0
  2023.     CMP    DX,BX
  2024.     JB    SHORT NoHigherFreq
  2025.     INC    AX
  2026. NoHigherFreq:
  2027.     MOV    [FREQ_TABLE+SI],AX
  2028.     INC    BP
  2029.     ADD    SI,2
  2030.     LOOP    CountLoop
  2031.     MOV    SAM_CH,8
  2032.     MOV    MOD_STAT,0
  2033.     MOV    PATT_ROW,64
  2034.     MOV    PATT_CURRENT,0
  2035.     MOV    PATT_SPEED,6
  2036.     MOV    PATT_COUNT,1
  2037.     MOV    DI,OFFSET SAMP_CHANS
  2038.     XOR    BX,BX
  2039.     MOV    CX,CH_NUMB
  2040. ClearVarLoop:
  2041.     MOV    [DI.FREQ_VAL],0
  2042.     MOV    [DI.VOL],0
  2043.     MOV    AL,[PAN_REGS+BX]
  2044.     SHL    AL,4
  2045.     OR    AL,[PAN_REGS+BX]
  2046.     MOV    [DI.BALANCE],AL
  2047.     INC    BX
  2048.     ADD    DI,CHAN_SIZE
  2049.     LOOP    ClearVarLoop
  2050.  
  2051.     XOR    BX,BX            ;Set Pan Regs!!
  2052.     MOV    CX,NumVoices
  2053. LLDM14:    MOV    DX,BASE_PORT
  2054.     ADD    DX,ActiveVoicePort
  2055.     MOV    AL,NumVoices
  2056.     SUB    AL,CL
  2057.     OUT    DX,AL
  2058.     MOV    DX,BASE_PORT
  2059.     ADD    DX,CommandPort
  2060.     MOV    AL,VoiceBalance
  2061.     OUT    DX,AL
  2062.     MOV    DX,BASE_PORT
  2063.     ADD    DX,DataHighPort
  2064.     MOV    AL,[PAN_REGS+BX]
  2065.     OUT    DX,AL
  2066.     INC    BX
  2067.     LOOP    LLDM14
  2068.  
  2069.     XOR    AX,AX
  2070.     MOV    DX,50
  2071.     MOV    BX,1024
  2072.     DIV    BX
  2073.     MOV    WORD PTR BPM_SPEED,AX
  2074.     XOR    AX,AX
  2075.     DIV    BX
  2076.     MOV    WORD PTR BPM_SPEED+2,AX
  2077.     MOV    BPM_COUNT,0
  2078.     MOV    COUNTER,20
  2079.     MOV    DX,BASE_PORT        ;Speaker On!!!
  2080.     MOV    AL,00000001B
  2081.     OUT    DX,AL
  2082.     STI
  2083.     CALL    IRQ_INIT
  2084.     RET
  2085. PLAY_MUSIC ENDP
  2086. ;-----------------------------------------------------------------------------
  2087. STOP_MUSIC PROC NEAR
  2088.     PUSH    CS
  2089.     POP    DS
  2090.     CALL    IRQ_INIT
  2091. US_OFF:    PUSH    CS
  2092.     POP    DS
  2093.     MOV    DX,BASE_PORT        ;Speaker Off!!!
  2094.     MOV    AL,00000011B
  2095.     OUT    DX,AL
  2096.     MOV    DX,BASE_PORT
  2097.     ADD    DX,ActiveVoicePort
  2098.     MOV    CX,NumVoices
  2099. VoiceClearL:
  2100.     MOV    AL,CL
  2101.     DEC    AL
  2102.     OUT    DX,AL
  2103.     INC    DX
  2104.     MOV    AL,WriteVoiceMode
  2105.     OUT    DX,AL
  2106.     ADD    DX,2
  2107.     MOV    AL,3            ;Voice Off
  2108.     OUT    DX,AL
  2109.     SUB    DX,2
  2110.     MOV    AL,VolumeCtrl
  2111.     OUT    DX,AL
  2112.     ADD    DX,2
  2113.     MOV    AL,3            ;Ramp Off
  2114.     OUT    DX,AL
  2115.     SUB    DX,3
  2116.     LOOP    VoiceClearL
  2117.     RET
  2118. STOP_MUSIC ENDP
  2119. ;-----------------------------------------------------------------------------
  2120. ; SERVICE IRQ SWAPPING; USES THE REAL-TIME-CLOCK OR TIMER IRQ
  2121. ;-----------------------------------------------------------------------------
  2122. IRQ_INIT PROC NEAR
  2123.     CLI
  2124.     XOR     AX,AX
  2125.     MOV     ES,AX
  2126.     CMP    SYSTEM,0
  2127.     JNE    SHORT WU11
  2128.     MOV     AX,COMP_SPEED2        ;XCHANGE INIT & STOP DATA FOR DOS
  2129.     MOV     DX,COMP_SPEED3
  2130.     MOV     COMP_SPEED2,DX
  2131.     MOV     COMP_SPEED3,AX
  2132.     MOV    AL,UHR_STATA        ;CLOCK-IRQ-RATE (1024 HZ)
  2133.     OUT    UHR_INDEX,AL
  2134.     JMP    SHORT WU1
  2135. WU1:    JMP    SHORT WU2
  2136. WU2:    XCHG    AL,AH
  2137.     IN    AL,UHR_PORT
  2138.     AND    AL,0F0H
  2139.     OR    AL,DL
  2140.     XCHG    AL,AH
  2141.     OUT    UHR_INDEX,AL
  2142.     JMP    SHORT WU3
  2143. WU3:    JMP    SHORT WU4
  2144. WU4:    XCHG    AL,AH
  2145.     OUT    UHR_PORT,AL
  2146.     JMP    SHORT WU5
  2147. WU5:    JMP    SHORT WU6
  2148. WU6:    MOV    AL,UHR_STATB        ;CLOCK-IRQ-MODUS
  2149.     OUT    UHR_INDEX,AL
  2150.     JMP    SHORT WU7
  2151. WU7:    JMP    SHORT WU8
  2152. WU8:    XCHG    AL,AH
  2153.     IN    AL,UHR_PORT
  2154.     AND    AL,08FH
  2155.     MOV    DL,DH
  2156.     AND    DL,40H
  2157.     OR    AL,DL
  2158.     XCHG    AL,AH
  2159.     OUT    UHR_INDEX,AL
  2160.     JMP    SHORT WU9
  2161. WU9:    JMP    SHORT WU10
  2162. WU10:    XCHG    AL,AH
  2163.     OUT    UHR_PORT,AL
  2164.     IN    AL,IRQ4            ;IRQ8 DE-/MASK
  2165.     AND    AL,0FEH
  2166.     MOV    DL,DH
  2167.     AND    DL,1
  2168.     OR    AL,DL
  2169.     OUT    IRQ4,AL
  2170.     MOV     BX,4*70H                ;UHR-IRQ DETOUR
  2171.     MOV     EAX,ES:[BX]
  2172.     MOV     EDX,HOLD70
  2173.     MOV     ES:[BX],EDX
  2174.     MOV     HOLD70,EAX
  2175.     JMP    SHORT WU12
  2176. WU11:    MOV     AX,COMP_SPEED4        ;FOR WINDOWS
  2177.     MOV     DX,COMP_SPEED5
  2178.     MOV     COMP_SPEED4,DX
  2179.     MOV     COMP_SPEED5,AX
  2180.     MOV     AL,00110110B            ;SET TIMER0 TO 1.024 KHZ
  2181.     OUT     PIT1,AL                 ;DIVIDER =1193
  2182.     MOV     AL,DL
  2183.     OUT     TIMER0,AL
  2184.     JMP     SHORT OUT40
  2185. OUT40:  MOV     AL,DH
  2186.     OUT     TIMER0,AL
  2187.     MOV     BX,4*8H                 ;TIMEOUT-IRQ DETOUR
  2188.     MOV     EAX,ES:[BX]
  2189.     MOV     EDX,HOLD70
  2190.     MOV     ES:[BX],EDX
  2191.     MOV     HOLD70,EAX
  2192. WU12:    MOV    AL,20H
  2193.     OUT    IRQ3,AL
  2194.     OUT    IRQ1,AL
  2195.     STI
  2196.     RET
  2197. IRQ_INIT ENDP
  2198. ;-----------------------------------------------------------------------------
  2199. GET_SONGMOD PROC NEAR
  2200.     MOV    AL,CS:US_MODUS
  2201.     RET
  2202. GET_SONGMOD ENDP
  2203. ;-----------------------------------------------------------------------------
  2204. SET_SONGMOD PROC NEAR
  2205.     AND    AL,3
  2206.     MOV    CS:US_MODUS,AL
  2207.     RET
  2208. SET_SONGMOD ENDP
  2209. ;-----------------------------------------------------------------------------
  2210. GET_SONGPOSITION PROC NEAR
  2211.     MOV    AL,BYTE PTR CS:PATT_CURRENT
  2212.     RET
  2213. GET_SONGPOSITION ENDP
  2214. ;-----------------------------------------------------------------------------
  2215. SET_SONGPOSITION PROC NEAR
  2216.     AND    AL,7FH
  2217.     MOV    BYTE PTR CS:PATT_CURRENT,AL
  2218.     MOV    CS:PATT_ROW,64
  2219.     RET
  2220. SET_SONGPOSITION ENDP
  2221. ;-----------------------------------------------------------------------------
  2222. SET_SONGLOOP PROC NEAR
  2223.     MOV    CS:SONG_LOOP,AL
  2224.     RET
  2225. SET_SONGLOOP ENDP
  2226. ;-----------------------------------------------------------------------------
  2227. GET_VOLUME PROC NEAR
  2228.     MOV    AL,BYTE PTR CS:MASTER_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2229.     MOV    BL,BYTE PTR CS:MUSIC_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2230.     MOV    BH,BYTE PTR CS:FX_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2231.     RET
  2232. GET_VOLUME ENDP
  2233. ;-----------------------------------------------------------------------------
  2234. SET_VOLUME PROC NEAR
  2235.     MOV    BYTE PTR CS:MASTER_VOLUME,AL    ;0= MIN VOLUME,255= MAX VOLUME
  2236.     MOV    BYTE PTR CS:MUSIC_VOLUME,BL    ;0= MIN VOLUME,255= MAX VOLUME
  2237.     MOV    BYTE PTR CS:FX_VOLUME,BH    ;0= MIN VOLUME,255= MAX VOLUME
  2238.     PUSH    AX DX
  2239.     MOVZX    DX,AL
  2240.     INC    DX
  2241.     PUSH    DX
  2242.     MOVZX    AX,BL
  2243.     MUL    DX
  2244.     MOV    BYTE PTR CS:MUSIC_VOL,AH
  2245.     POP    DX
  2246.     MOVZX    AX,BH
  2247.     MUL    DX
  2248.     MOV    BYTE PTR CS:FX_VOL,AH
  2249.     POP    DX AX
  2250.     RET
  2251. SET_VOLUME ENDP
  2252. ;-----------------------------------------------------------------------------
  2253. ; START FX SAMPLE
  2254. ; BX= SAMPLE-HANDLE, CX= FREQUENCE (HZ)
  2255. ;-----------------------------------------------------------------------------
  2256. PLAY_SAMPLE PROC NEAR
  2257.     PUSH    CS
  2258.     POP    DS
  2259.     TEST    US_MODUS,1
  2260.     JNZ    GPSMP1
  2261.     CLI
  2262.     MOV    DI,OFFSET SAMPLE_CHAN
  2263.     MOV    [DI.OFFSET_ADD],0
  2264.     MOV    [DI.REPEAT],0
  2265.     MOV    AX,[SAMPLE_BIG+BX]
  2266.     MOV    [DI.LEN],AX
  2267.     MOV    DX,1024
  2268.     MUL    DX
  2269.     DIV    CX
  2270.     SUB    AX,64
  2271.     JNC    SHORT LOW_COUNT
  2272.     MOV    AX,1
  2273. LOW_COUNT:
  2274.     MOVZX    SI,SAM_CH
  2275.     SUB    SI,8
  2276.     SHL    SI,1
  2277.     MOV    [SAM_COUNT+SI],AX
  2278.     MOV    AX,100
  2279.     MUL    CX
  2280.     MOV    BP,Voices14
  2281.     DIV    BP
  2282.     SHR    BP,1
  2283.     ADC    BP,0
  2284.     CMP    DX,BP
  2285.     JB    SHORT NoHigherFreq2
  2286.     INC    AX
  2287. NoHigherFreq2:
  2288.     MOV    [DI.FREQ_VAL],AX
  2289.     SHL    BX,1
  2290.     MOV    EAX,[SAMPLE_MEM+BX]
  2291.     MOV    [DI.SAMP_OFF],EAX
  2292.     MOV    DX,BASE_PORT
  2293.     ADD    DX,CommandPort
  2294.     DEC    DX
  2295.     MOV    AL,SAM_CH
  2296.     OUT    DX,AL
  2297.     INC    DX
  2298.     MOV    AH,3
  2299.     CALL    SEND_WRITE_VOICE
  2300.     CALL    WAIT_PORT
  2301.     CALL    SEND_SAMPLE_START
  2302.     CALL    SEND_SAMPLE_END
  2303.     CALL    SEND_SAMPLE_LOOP
  2304.     MOV    AH,3
  2305.     CALL    SEND_WRITE_VOICE
  2306.     MOV    BP,GUS_VOL        ;SET VOLUME
  2307.     MOV    BX,FX_VOL
  2308.     INC    BX
  2309.     SHR    BX,2
  2310.     CMP    BL,40H
  2311.     JBE    SHORT FIXVL
  2312.     MOV    BL,40H
  2313. FIXVL:    SHL    BX,1
  2314.     MOV    BX,[GUS_VOL+BX]
  2315.     XCHG    BX,BP
  2316.     CALL    SEND_RAMP
  2317.     MOV    AL,SetVoiceFreq        ;SET FREQUENCE
  2318.     OUT    DX,AL
  2319.     INC    DX
  2320.     MOV    AX,[DI.FREQ_VAL]
  2321.     OUT    DX,AX
  2322.     DEC    DX
  2323.     DEC    DX            ;START VOICE
  2324.     MOV    AL,SAM_CH
  2325.     OUT    DX,AL
  2326.     INC    DX
  2327.     MOV    AH,0            ;NO LOOP
  2328.     CALL    SEND_WRITE_VOICE
  2329.     CALL    WAIT_PORT
  2330.     STI
  2331.     INC    SAM_CH
  2332.     CMP    SAM_CH,13
  2333.     JB    SHORT GPSMP1
  2334.     MOV    SAM_CH,8
  2335. GPSMP1:    RET
  2336. PLAY_SAMPLE ENDP
  2337. ;-----------------------------------------------------------------------------
  2338. END_SAMPLE PROC NEAR
  2339.     MOV    CS:SAMPLE_ZEIG,0
  2340.     RET
  2341. END_SAMPLE ENDP
  2342. ;=============================================================================
  2343.  
  2344.  
  2345. ;=============================================================================
  2346. ; LOAD CONFIG DATA (PARSER)
  2347. ;-----------------------------------------------------------------------------
  2348. CONFIG_INIT PROC NEAR
  2349.     MOV    AX,CS            ;SAVE SEGMENT OF CODE
  2350.     MOV    DS,AX
  2351.     MOV    WORD PTR HOLD70+2,AX    ;THIS LINE IS IMPORTANT
  2352.     MOV     DX,OFFSET CONFIG_NAME
  2353.     MOV     AH,3DH
  2354.     MOV     AL,80H
  2355.     INT     21H
  2356.     JC      SHORT GCFG1
  2357.     MOV     GDDHANDLE,AX
  2358. LCFG1:  XOR     SI,SI
  2359.     MOV     DX,OFFSET QUEUE_BUFFER
  2360. LCFG2:  MOV     AH,3FH
  2361.     MOV     BX,GDDHANDLE
  2362.     MOV     CX,1
  2363.     INT     21H
  2364.     JC      SHORT GCFG2
  2365.     OR      AX,AX
  2366.     JZ      SHORT GCFG2
  2367.     MOV     DI,DX
  2368.     CMP     BYTE PTR [DI],0AH
  2369.     JE      SHORT GCFG6
  2370.     INC     DX
  2371.     INC     SI
  2372.     CMP     SI,256
  2373.     JB      LCFG2
  2374. GCFG6:  MOV     BX,OFFSET CFG_TEXT2
  2375.     CALL    SEEK_LINE
  2376.     JNC     SHORT GCFG4
  2377.     LODSB
  2378.     AND     AL,3
  2379.     MOV    US_MODUS,AL
  2380.     JMP     LCFG1
  2381. GCFG4:  MOV     BX,OFFSET CFG_TEXT3
  2382.     CALL    SEEK_LINE
  2383.     JNC     SHORT GCFG5
  2384.     INC    SI
  2385.     LODSB
  2386.     DEC    AL
  2387.     AND    AL,7
  2388.     INC    AL
  2389.     SHL    AL,4
  2390.     MOV    AH,2
  2391.     MOV    BASE_PORT,AX
  2392.     JMP     LCFG1
  2393. GCFG5:  MOV     BX,OFFSET CFG_TEXT5
  2394.     CALL    SEEK_LINE
  2395.     JNC     SHORT GCFG7
  2396.     LODSB
  2397.     AND    AX,7
  2398.     MOV    DMA_CHANNEL,AX
  2399.     JMP    LCFG1
  2400. GCFG7:    MOV     BX,OFFSET CFG_TEXT7
  2401.     CALL    SEEK_LINE
  2402.     JNC     LCFG1
  2403.     LODSB
  2404.     AND     AL,1
  2405.     MOV     SYSTEM,AL
  2406.     JMP     LCFG1
  2407. GCFG2:  MOV     BX,GDDHANDLE
  2408.     MOV     AH,3EH
  2409.     INT     21H
  2410. GCFG1:  RET
  2411. CONFIG_INIT ENDP
  2412. ;-----------------------------------------------------------------------------
  2413. SEEK_LINE PROC NEAR
  2414.     CLD
  2415.     MOV     SI,OFFSET QUEUE_BUFFER
  2416. LSKL1:  PUSH    BX
  2417. LSKL2:  CMP     BYTE PTR [BX],0
  2418.     JE      SHORT GSKL1
  2419.     CMP     SI,DX
  2420.     JAE     SHORT GSKL2
  2421.     LODSB
  2422.     CMP     AL,[BX]
  2423.     JNE     SHORT GSKL3
  2424.     INC     BX      
  2425.     JMP     LSKL2
  2426. GSKL3:  POP     BX
  2427.     JMP     LSKL1
  2428. GSKL2:  POP     BX
  2429.     CLC
  2430.     RET
  2431. GSKL1:  POP     BX
  2432.     STC
  2433.     RET
  2434. SEEK_LINE ENDP
  2435. ;=============================================================================
  2436.  
  2437.  
  2438. ;=============================================================================
  2439. ;
  2440. ; MOD LOAD ROUTINES
  2441. ;
  2442. ;=============================================================================
  2443. ; LOAD A MODFILE
  2444. ; DS:DX= FILENAME
  2445. ;-----------------------------------------------------------------------------
  2446. LOAD_MOD PROC NEAR
  2447.     MOV    AX,3D00H        ;OPEN MOD
  2448.     INT    21H
  2449.     JC    GLDM1
  2450.     PUSH    CS
  2451.     POP    DS
  2452.     MOV    GDDHANDLE,AX
  2453. GLDM0:    CALL    SET_TMEM        ;ALLOCATE TRACK-BUFFER
  2454.     MOV    BX,GDDHANDLE
  2455.     MOV    GDDZEIG,0
  2456.     MOV    CX,10            ;GET SONG-NAME
  2457. LLDM1:    CALL    GET_QUEUE
  2458.     JC    GLDM2
  2459.     LOOP    LLDM1
  2460.     XOR    SI,SI            ;31 INSTRUMENTS
  2461. LLDM2:    MOV    CX,11            ;INSTRUMENT NAME
  2462. LLDM3:    CALL    GET_QUEUE    
  2463.     JC    GLDM2
  2464.     LOOP    LLDM3
  2465.     XOR    EAX,EAX
  2466.     CALL    GET_QUEUE        ;INSTRUMENT SIZE
  2467.     XCHG    AL,AH
  2468.     CMP    AX,2
  2469.     JAE    SHORT GLDM20
  2470.     XOR    AX,AX
  2471. GLDM20:    SHL    AX,1
  2472.     MOV    [ISIZE+SI],AX        ;NO MORE THAN 64K
  2473.     CALL    GET_QUEUE        ;IVOLUME & FINETUNE
  2474.     PUSH    AX
  2475.     XOR    AH,AH
  2476.     MOV    [IFINETUNE+SI],AX
  2477.     POP    AX
  2478.     SHR    AX,8
  2479.     CMP    AX,40H
  2480.     JBE    SHORT GLDM9
  2481.     MOV    AX,40H
  2482. GLDM9:    MOV    [IVOLUME+SI],AX
  2483.     CALL    GET_QUEUE        ;ILOOP_START
  2484.     XCHG    AL,AH
  2485.     SHL    AX,1
  2486.     MOV    [ILOOP_START+SI],AX
  2487.     CALL    GET_QUEUE        ;ILOOP_SIZE
  2488.     XCHG    AL,AH
  2489.     SHL    AX,1
  2490.     MOV    [ILOOP_SIZE+SI],AX
  2491.     INC    SI
  2492.     INC    SI
  2493.     CMP    SI,62
  2494.     JB    LLDM2
  2495.     CALL    GET_QUEUE        ;SONG_SIZE & LOOP_BYTE OR NOTHING
  2496.     JC    GLDM2
  2497.     MOV    SONG_SIZE,AL
  2498.     MOV    SONG_LOOP,AH
  2499.     XOR    DX,DX
  2500.     MOV    CX,64            ;SONG_DATA
  2501.     MOV    DI,OFFSET SONG_DATA
  2502. LLDM4:    CALL    GET_QUEUE
  2503.     JC    GLDM2
  2504.     MOV    [DI],AX
  2505.     CMP    AL,DL            ;FIND HIGHEST PATTERN NUMBER
  2506.     JBE    SHORT GLDM12
  2507.     MOV    DL,AL
  2508. GLDM12:    CMP    AH,DL
  2509.     JBE    SHORT GLDM13
  2510.     MOV    DL,AH
  2511. GLDM13:    INC    DI
  2512.     INC    DI
  2513.     LOOP    LLDM4
  2514.     INC    DL
  2515.     CLD
  2516.     MOV    PATTERN_NUMBER,DX
  2517.     CALL    GET_QUEUE
  2518.     PUSH    AX
  2519.     CALL    GET_QUEUE
  2520.     SHL    EAX,16
  2521.     POP    AX
  2522.     CMP    EAX,"NHC8"        ;8CHN-MOD
  2523.     JE    SHORT GLDM3
  2524.     CMP    EAX,"8TLF"        ;FLT8-MOD
  2525.     JE    SHORT GLDM3
  2526.     CMP    EAX,"ATCO"        ;OCTA-MOD
  2527.     JE    SHORT GLDM3
  2528.     CMP    EAX,"NHC6"        ;6CHN-MOD
  2529.     JE    SHORT GLDM16
  2530.     CMP    EAX,".K.M"        ;M.K.-MOD
  2531.     JE    SHORT GLDM10
  2532.     CMP    EAX,"4TLF"        ;FLT4-MOD
  2533.     JNE    GLDM2
  2534.  
  2535. GLDM10:    MOV    CH_NUMB,4        ;4-CHANNEL-MOD
  2536.     MOV    PATTERN_SIZE,1024
  2537.     MOV    AH,0
  2538.     MOV    TRACK_INFO+4,AH
  2539.     MOV    TRACK_INFO+5,AH
  2540.     MOV    TRACK_INFO+6,AH
  2541.     MOV    TRACK_INFO+7,AH
  2542.     JMP    SHORT GLDM11
  2543. GLDM16:    MOV    CH_NUMB,6        ;6-CHANNEL-MOD
  2544.     MOV    PATTERN_SIZE,1536
  2545.     MOV    AH,0
  2546.     MOV    TRACK_INFO+6,AH
  2547.     MOV    TRACK_INFO+7,AH
  2548.     JMP    SHORT GLDM11
  2549. GLDM3:    MOV    CH_NUMB,8        ;8-CHANNEL-MOD: GET-PATTERNS
  2550.     MOV    PATTERN_SIZE,2048
  2551. GLDM11:    MOV    PATT_CURRENT,0
  2552.     MOV    TRACK_NUMBER,0
  2553. LLDM7:    MOV    ES,PATTERN_SEG
  2554.     MOV    BX,GDDHANDLE
  2555.     XOR    DI,DI
  2556. LLDM6:    XOR    SI,SI
  2557. LLDM5:    CALL    GET_QUEUE        ;GET PATTERNS AND SPLIT INTO TRACKS 
  2558.     JC    GLDM2
  2559.     MOV    DX,AX
  2560.     CALL    GET_QUEUE
  2561.     JC    GLDM2
  2562.     PUSH    DI
  2563.     ADD    DI,SI
  2564.     SHL    EAX,16
  2565.     MOV    AX,DX
  2566.     STOSD
  2567.     POP    DI
  2568.     ADD    SI,256
  2569.     CMP    SI,PATTERN_SIZE        ;NEXT TRACK/CHANNEL
  2570.     JB    LLDM5
  2571.     ADD    DI,4            ;NEXT NOTE
  2572.     CMP    DI,256
  2573.     JB    LLDM6
  2574.     MOV    ES,TRACK_SEG        ;INTEGRATE TRACK1-8
  2575.     MOV    DX,TRACK_NUMBER
  2576.     XCHG    DL,DH
  2577.     MOV    DS,PATTERN_SEG
  2578.     XOR    SI,SI
  2579.     XOR    BX,BX
  2580. LLDM8:    XOR    DI,DI
  2581. LLDM9:    CMP    DX,DI
  2582.     JBE    SHORT GLDM4
  2583.     PUSH    SI DI
  2584.     MOV    CX,256/4
  2585.     REPE CMPSD            ;TRACK ALREADY EXISTS?
  2586.     POP    DI SI
  2587.     PUSHF
  2588.     ADD    DI,256
  2589.     POPF
  2590.     JNE    LLDM9
  2591.     JMP    SHORT GLDM5
  2592. GLDM4:    INC    DH            ;NO, ADD TRACK TO BUFFER
  2593.     PUSH    SI
  2594.     MOV    CX,256/4
  2595.     REP MOVSD
  2596.     POP    SI
  2597. GLDM5:    MOV    AX,DI            ;YES
  2598.     DEC    AH
  2599.     MOV    CS:[TRACK_INFO+BX],AH
  2600.     INC    BX
  2601.     ADD    SI,256
  2602.     CMP    BX,CS:CH_NUMB
  2603.     JB    LLDM8
  2604.     PUSH    CS
  2605.     POP    DS
  2606.     XCHG    DL,DH
  2607.     MOV    TRACK_NUMBER,DX
  2608.     XOR    BX,BX            ;MAKE TRACKLIST
  2609.     MOV    AX,PATT_CURRENT
  2610. LLDM10:    CMP    [SONG_DATA+BX],AL
  2611.     JNE    SHORT GLDM6
  2612.     MOV    AH,TRACK_INFO
  2613.     MOV    [TRACK1_DATA+BX],AH
  2614.     MOV    AH,TRACK_INFO+1
  2615.     MOV    [TRACK2_DATA+BX],AH
  2616.     MOV    AH,TRACK_INFO+2
  2617.     MOV    [TRACK3_DATA+BX],AH
  2618.     MOV    AH,TRACK_INFO+3
  2619.     MOV    [TRACK4_DATA+BX],AH
  2620.     MOV    AH,TRACK_INFO+4
  2621.     MOV    [TRACK5_DATA+BX],AH
  2622.     MOV    AH,TRACK_INFO+5
  2623.     MOV    [TRACK6_DATA+BX],AH
  2624.     MOV    AH,TRACK_INFO+6
  2625.     MOV    [TRACK7_DATA+BX],AH
  2626.     MOV    AH,TRACK_INFO+7
  2627.     MOV    [TRACK8_DATA+BX],AH
  2628. GLDM6:    INC    BX
  2629.     CMP    BL,128
  2630.     JB    LLDM10
  2631.     INC    PATT_CURRENT        ;GET NEXT PATTERN
  2632.     MOV    AX,PATT_CURRENT
  2633.     CMP    AX,PATTERN_NUMBER
  2634.     JB    LLDM7
  2635. GLDM7:    MOV    ES,PATTERN_SEG        ;CLEAR PATTERN SEGMENT
  2636.     MOV    AH,49H
  2637.     INT    21H
  2638.     MOV    PATTERN_SEG,0
  2639.     MOV    BX,TRACK_NUMBER        ;RESIZE TRACK SEGMENT
  2640.     SHL    BX,4
  2641.     MOV    ES,TRACK_SEG
  2642.     MOV    AH,4AH
  2643.     INT    21H
  2644.  
  2645.     MOVZX    AX,GDDZEIG        ;SET FILEPOINTER BACK
  2646.     OR    AX,AX            ;BUFFER QUIT
  2647.     JZ    SHORT GLDM30
  2648.     MOV    DX,GDDREST
  2649.     SUB    DX,AX
  2650.     JZ    SHORT GLDM30
  2651.     XOR    CX,CX
  2652.     MOV    GDDZEIG,CL
  2653.     MOV    BX,GDDHANDLE
  2654.     NEG    DX
  2655.     DEC    CX
  2656.     MOV    AX,4201H
  2657.     INT    21H
  2658. GLDM30:    MOV    AH,48H            ;SAMPLE BUFFER READY
  2659.     MOV    BX,2000H        ;128K BECAUSE OF 64K DMA PAGE
  2660.     INT    21H
  2661.     MOV    GDDSEG,AX
  2662.     TEST    AX,0FFFH
  2663.     JZ    SHORT GLDM31
  2664.     AND    AX,0F000H
  2665.     ADD    AX,1000H
  2666. GLDM31:    MOV    BUFSEG,AX
  2667.     CALL    INIT_DEVICE        ;IS PROBABLY THE FIRST INIT
  2668.     XOR    EDI,EDI            ;LOAD SAMPLES
  2669.     MOV    GUS_MEM,EDI
  2670.     XOR    SI,SI
  2671. LLDM12:    PUSH    SI
  2672.     MOV    CX,[ISIZE+SI]
  2673.     JCXZ    SHORT GLDM8
  2674.     SHL    SI,1
  2675.     TEST    EDI,31
  2676.     JZ    SHORT GLDM32
  2677.     AND    EDI,-32            ;32 BYTE BOUND FOR DMA
  2678.     ADD    EDI,32
  2679. GLDM32:    MOV    [IOFFSET+SI],EDI
  2680.     MOV    BX,GDDHANDLE        ;SAMPLE IN BUFFER
  2681.     PUSH    DS
  2682.     XOR    DX,DX
  2683.     MOV    SI,DX
  2684.     MOV    DS,BUFSEG
  2685.     MOV     AH,3FH
  2686.     INT     21H
  2687.     SHR    CX,1
  2688.     XOR    BX,BX            ;AMIGA-SAMPLE
  2689.     CALL    SEND_SAMPLE_DATA
  2690.     POP    DS
  2691. GLDM8:    POP    SI
  2692.     INC    SI
  2693.     INC    SI
  2694.     CMP    SI,62
  2695.     JB    LLDM12
  2696.     MOV    ES,GDDSEG        ;CLEAR SAMPLE BUFFER
  2697.     MOV    AH,49H
  2698.     INT    21H
  2699.     MOV    GDDSEG,0
  2700.     CLC
  2701.     JMP    SHORT GLDM15
  2702. GLDM2:    STC
  2703. GLDM15:    PUSHF
  2704.     MOV    AH,3EH
  2705.     MOV    BX,GDDHANDLE
  2706.     INT    21H
  2707.     POPF
  2708. GLDM1:    RET
  2709. LOAD_MOD ENDP
  2710. ;-----------------------------------------------------------------------------
  2711. ; GET A WORD FROM BUFFER
  2712. ; IN: AX= WORD, BX= HANDLE
  2713. ;-----------------------------------------------------------------------------
  2714. GET_QUEUE PROC NEAR
  2715.     CMP     GDDZEIG,0
  2716.     JNE     SHORT GTQ1
  2717.     PUSH    CX DX
  2718.     MOV     DX,OFFSET QUEUE_BUFFER
  2719.     MOV     CX,256
  2720.     MOV     AH,3FH
  2721.     INT     21H
  2722.     MOV    GDDREST,AX
  2723.     POP    DX CX
  2724. GTQ1:   PUSH    BX
  2725.     MOV     BL,GDDZEIG
  2726.     XOR     BH,BH
  2727.     CMP    BX,GDDREST
  2728.     JAE    SHORT GTQ2
  2729.     MOV     AX,[QUEUE_BUFFER+BX]
  2730.     ADD     GDDZEIG,2
  2731.     POP    BX
  2732.     CLC
  2733.     RET
  2734. GTQ2:    POP    BX
  2735.     STC
  2736.     RET
  2737. GET_QUEUE ENDP
  2738. ;----------------------------------------------------------------------------
  2739. ; MEMORY FOR TRACKS, CARRY-FLAG 0=OK 1=ERROR
  2740. ;----------------------------------------------------------------------------
  2741. SET_TMEM PROC NEAR
  2742.     MOV     AH,48H
  2743.     MOV     BX,1000H                ;64K TRACK BUFFER (WIRD RESIZED)
  2744.     INT     21H
  2745.     JC      SHORT STCM1
  2746.     MOV     TRACK_SEG,AX
  2747.     MOV    AH,48H
  2748.     MOV    BX,80H            ;2K PATTERN BUFFER
  2749.     INT    21H
  2750.     JC    SHORT STCM1
  2751.     MOV    PATTERN_SEG,AX
  2752. STCM1:  RET
  2753. SET_TMEM ENDP
  2754. ;----------------------------------------------------------------------------
  2755. END_MUSIC PROC NEAR
  2756.     CALL    INIT_DEVICE
  2757.     MOV     AH,49H
  2758.     MOV     ES,TRACK_SEG
  2759.     INT     21H
  2760.     CMP    PATTERN_SEG,0
  2761.     JE    SHORT LEM3
  2762.     MOV     AH,49H
  2763.     MOV     ES,PATTERN_SEG
  2764.     INT     21H
  2765.     MOV    PATTERN_SEG,0
  2766. LEM3:    CMP    GDDSEG,0
  2767.     JE    SHORT LEM4
  2768.     MOV     AH,49H
  2769.     MOV     ES,GDDSEG
  2770.     INT     21H
  2771.     MOV    GDDSEG,0
  2772. LEM4:    XOR    EAX,EAX
  2773.     MOV    GDDLENGTH,EAX
  2774.     MOV    GDDREST,AX
  2775.     MOV    GDDHANDLE,AX
  2776.     MOV    GDDSEG,AX
  2777.     MOV    BUFSEG,AX
  2778.     MOV    GDDZEIG,AL        ;RESET VARIABLES
  2779.     MOV    SAM_CH,8
  2780.     MOV    MOD_STAT,AL
  2781.     XOR    BX,BX
  2782.     MOV    CX,11
  2783. LEM1:    MOV    WORD PTR [BPM_COUNT+BX],AX
  2784.     ADD    BX,2
  2785.     LOOP    LEM1
  2786.     MOV    CH_NUMB,4
  2787.     MOV    TRACK_NUMBER,AX
  2788.     MOV    DWORD PTR TRACK_INFO,EAX
  2789.     MOV    DWORD PTR TRACK_INFO+4,EAX
  2790.     MOV    TRACK_SEG,AX
  2791.     MOV    BX,OFFSET TRACK1_DATA
  2792. LEM2:    MOV    [BX],AL
  2793.     INC    BX
  2794.     CMP    BX,OFFSET PATTJUMPS
  2795.     JB    LEM2
  2796.     MOV    IRQCOUNT,56
  2797.     RET
  2798. END_MUSIC ENDP
  2799. ;=============================================================================
  2800. ; LOAD A SAMPLE
  2801. ; INPUT: DS:DX= FILENAME, CL= 00H AMIGA-SAMPLE, 80H PC-SAMPLE
  2802. ; OUTPUT: AX= SAMPLE-HANDLE FOR PLAYING
  2803. ;-----------------------------------------------------------------------------
  2804. LOAD_SAMPLE PROC NEAR
  2805.     MOV    AX,3D00H        ;OPEN SAMPLE
  2806.     INT    21H
  2807.     JC    GSMP1
  2808.     PUSH    CS
  2809.     POP    DS
  2810.     MOV    GDDHANDLE,AX
  2811.     MOV    BX,AX
  2812.     PUSH    CX
  2813.     CALL    GET_FILESIZE
  2814.     POP    CX
  2815. GSMP0:    AND    CL,80H
  2816.     MOV    CH,CL
  2817.     PUSH    DS CX
  2818.     MOV    GDDZEIG,0
  2819.     MOV    CX,AX
  2820.     AND    CX,0FFFEH
  2821.     MOV    AH,48H            ;SAMPLE BUFFER READY
  2822.     MOV    BX,2000H        ;128K BECAUSE OF 64K DMA PAGE
  2823.     INT    21H
  2824.     MOV    GDDSEG,AX
  2825.     TEST    AX,0FFFH
  2826.     JZ    SHORT GSMP2
  2827.     AND    AX,0F000H
  2828.     ADD    AX,1000H
  2829. GSMP2:    MOV    BUFSEG,AX
  2830.     MOV    EDI,GUS_MEM
  2831.     TEST    EDI,31
  2832.     JZ    SHORT GSMP3
  2833.     AND    EDI,-32            ;32 BYTE BOUND FOR DMA
  2834.     ADD    EDI,32
  2835. GSMP3:    MOV    SI,SAMPLE_ZEIG
  2836.     MOV    [SAMPLE_BIG+SI],CX
  2837.     SHL    SI,1
  2838.     MOV    [SAMPLE_MEM+SI],EDI
  2839.     MOV    BX,GDDHANDLE        ;SAMPLE IN BUFFER
  2840.     XOR    DX,DX
  2841.     MOV    SI,DX
  2842.     MOV    DS,BUFSEG
  2843.     MOV     AH,3FH
  2844.     INT     21H
  2845.     SHR    CX,1
  2846.     POP    BX
  2847.     CLD
  2848.     CALL    SEND_SAMPLE_DATA
  2849.     POP    DS
  2850.     MOV    ES,GDDSEG        ;CLEAR SAMPLE BUFFER
  2851.     MOV    AH,49H
  2852.     INT    21H
  2853.     MOV    GDDSEG,0
  2854.     MOV    BX,GDDHANDLE
  2855.     MOV    AH,3EH
  2856.     INT    21H
  2857.     MOV    AX,SAMPLE_ZEIG
  2858.     ADD    SAMPLE_ZEIG,2
  2859.     CLC
  2860. GSMP1:    RET
  2861. LOAD_SAMPLE ENDP
  2862. ;-----------------------------------------------------------------------------
  2863. GET_FILESIZE PROC NEAR
  2864.     MOV    AX,4202H
  2865.     XOR    CX,CX
  2866.     XOR    DX,DX
  2867.     INT    21H
  2868.     PUSH    AX
  2869.     MOV    AX,4200H
  2870.     XOR    CX,CX
  2871.     XOR    DX,DX
  2872.     INT    21H
  2873.     POP    AX
  2874.     RET
  2875. GET_FILESIZE ENDP
  2876. ;=============================================================================
  2877.  
  2878. END MAIN